Я написал небольшое приложение, которое анализирует выражения в абстрактные синтаксические деревья. Прямо сейчас я использую кучу эвристик для выражения, чтобы решить, как лучше всего оценить запрос. К сожалению, есть примеры, которые делают план запроса крайне плохим.
Я нашел способ доказуемо делать лучшие предположения о том, как должны оцениваться запросы, но мне нужно сначала поместить выражение в CNF или DNF, чтобы получить доказуемо правильные ответы. Я знаю, что это может привести к потенциально экспоненциальному увеличению времени и пространства, но для типичных запросов, которые выполняют мои пользователи, это не проблема.
Теперь преобразование в CNF или DNF — это то, что я все время делаю вручную, чтобы упростить сложные выражения. (Ну, может быть, не все время, но я знаю, как это делается с помощью, например, законов Деморгана, дистрибутивных законов и т. д.) Однако я не уверен, как начать переводить это в метод, который реализуется в виде алгоритма. Я просмотрел статьи по оптимизации запросов, и некоторые из них начинаются со слов «сначала мы помещаем вещи в CNF» или «сначала мы помещаем вещи в DNF», и они, кажется, никогда не объясняют свой метод для достижения этого.
С чего начать?