式を解析して抽象的な構文ツリーにする小さなアプリを作成しました。現在、クエリを最適に評価する方法を決定するために、式に対して一連のヒューリスティックを使用しています。残念ながら、クエリ プランを非常に悪くする例があります。
クエリがどのように評価されるべきかについて、証明可能なより良い推測を行う方法を見つけましたが、証明可能な正しい答えを得るためには、最初に式を CNF または DNF に入れる必要があります。これにより時間と空間が指数関数的になる可能性があることはわかっていますが、ユーザーが実行する通常のクエリではこれは問題ではありません。
さて、CNFやDNFへの変換は、複雑な式を簡略化するために、いつも手作業で行っています。(まあ、いつもではないかもしれませんが、デモガンの法則、分配法則などを使用してそれがどのように行われるかは知っています。)しかし、それをアルゴリズムとして実装可能なメソッドに変換する方法がわかりません。私はクエリの最適化に関する論文を見てきましたが、いくつかは「最初に CNF に入れます」または「最初に DNF に入れます」で始まり、それを達成するための方法を説明していないようです。
どこから始めればよいですか?