Prolog で DCG を使用して論理式を解析したいと考えています。
論理項はリストとして表されます。たとえば['x','&&','y']
、x ∧ y
結果は解析ツリーになりますand(X,Y)
(以前と未割り当ての Prolog 変数です)。X
Y
私はそれを実装し、すべてが期待どおりに機能しますが、問題が 1 つあります。変数を
解析して実際の Prolog 変数を取得する方法と、後で真理値を割り当てる方法がわかりません。'x'
'y'
X
Y
次のルールのバリエーションを試しました。
v(X) --> [X].
:
これはもちろん機能しません。返されるだけand('x','y')
です。
しかし、この項の論理変数を一様に Prolog 変数に置き換えることはできますか? 私は述語(同様の問題term_to_atom
の解決策として提案されている)を知っていますが、ここでそれを使用して目的の結果を達成できるとは思いません。v(Y) --> [X], {nonvar(Y)}.
:
これはバインドされていない変数を返しますが、もちろん、論理変数 ('x'、'y'、...) が既に用語に含まれている場合でも、毎回新しい変数が返さ れるため、目的の結果ではない値['X','&&','X']
に評価されます。and(X,Y)
.
この問題に対する洗練された、または慣用的な解決策はありますか?
よろしくお願いします!
編集:
この質問の背景は、Prolog でDPLL アルゴリズムを実装しようとしているということです。Prolog バックトラッキング機能を簡単に利用できるように、論理項を Prolog-term に直接解析するのは賢明だと思いました。
- 入力: T = などの論理項
[x,'&&',y]
- 解析後の用語:
[G_123,'&&',G_456]
(「実際の」Prolog 変数が含まれるようになりました) - { boolean(t), boolean(f) } からの値を T の最初のバインドされていない変数に代入します。
- 用語を簡略化します。
v
...割り当てが見つかるまで繰り返すか、v(T) = t
または検索スペースが枯渇するまでバックトラックします。
私は Prolog にかなり慣れていないので、正直なところ、より良いアプローチを見つけることができませんでした。私はより良い代替案に非常に興味があります!(だから私はこれが私が望んでいるものであることに少し自信があります;-)そしてこれまでのあなたのサポートにとても感謝しています...)