2

基本的にデータソースとして機能する、インターフェイスする必要のあるライブラリがあります。データを取得するときに、特別な「フィルター式」をそのライブラリに渡すことができます。このライブラリは、後でSQLWHERE部分に変換されます。これらの表現はかなり制限されています。それらは連言標準形でなければなりません。好き:

(A or B or C) and (D or E or F) and ...

もちろん、これはプログラミングにとってあまり快適ではありません。そこで、任意の式を解析してこの正規形に変換できる小さなラッパーを作成したいと思います。好き:

(A and (B or C) and D) or E

次のようなものに翻訳されます:

(A or E) and (B or C or E) and (D or E)

Ironyライブラリを使用して、式をツリーに解析できます。今、私はそれを正規化する必要があります、しかし私は方法がわかりません...ああ、また、ここにひねりがあります:

  • 最終的な式には、NOT演算子を含めることはできません。ただし、演​​算子を逆演算子に置き換えることで、個々の項を逆にすることができます。だから、これはOKです:

    (not A or not B) AND (not C or not D)

    しかし、これはそうではありません:

    not (A or B) and not (C or D)

  • 式は実質的に同一のSQLWHEREステートメントに変換されるため、式をできるだけ単純にしたいので、複雑なステートメントは実行速度を低下させる可能性があります。
4

1 に答える 1

3

ツリー上で2回の反復を使用しますが、おそらく1回で可能です。

最初の反復:ツリーを歩き、ド・モルガンの法則(ウィキペディアのリンク)を使用してNOTノードを取り除き、該当する場合は二重否定を削除します。

2回目の反復(NOTはリーフノードの直前にのみ存在します)ツリーを通過します。

Case "AND NODE":
    fine, inspect the children
Case "OR NODE":
    if there is a child which is neither a Leaf nor a NOT node
        apply the distributive law.
        start from parent of current node again
    else
        fine, inspect children

その後、あなたは行われるべきです。

于 2009-05-18T09:33:09.200 に答える