0

私は回避できないこのプロローグの問題を抱えています。私が達成しようとしているのは、FACT Aをアサートし、入力があったときにFact Bを撤回することです。つまり、Fact Bを取得してアサートし、入力が入ったときにFactAを撤回します。

すなわち:

:- dynamic s/2.
:- dynamic s/3.

s(P0, s(V, NP)) --> v(P1, V), np(P2, NP), {P0 is P1*P2*0.35}.

s(P0, s(V, NP, PP)) --> v(P1, V), np(P2, NP), pp(P3, PP), {P0 is P1*P2*P3*0.65}.
s(P0, s(V, NP)) --> v(P1, V), np(P2, NP), {V == take -> P0 is P1*P2*0.35; P0 is 0}.
s(P0, s(V, NP, PP)) --> v(P1, V), np(P2, NP), pp(P3, PP), {V == put -> P0 is P1*P2*P3*0.65; P0 is 0}.

np(P0, np(D, N)) --> det(P1, D), n(P2, N), {P0 is P1*P2*0.36}.
np(P0, np(D, A, N)) --> det(P1, D), a(P2, A), n(P3, N), {P0 is P1*P2*P3*0.46}.
np(P0, np(D, N, PP)) --> det(P1, D), n(P2, N), pp(P3, PP), {P0 is P1*P2*P3*0.13}.
np(P0, np(D, A, N, PP)) --> det(P1, D), a(P2, A), n(P3, N), pp(P4, PP), {P0 is P1*P2*P3*P4*0.05}.

pp(P0, pp(P, NP)) --> p(P1, P), np(P2, NP), {P0 is P1*P2*1.0}.

v(0.65, v(put)) --> {retract(s(V, NP))}, [put].
v(0.35, v(take)) --> {retract(s(V, NP, PP))}, [take].

n(0.23, n(block)) --> [block].
n(0.25, n(circle)) --> [circle].
n(0.15, n(cone)) --> [cone].
n(0.12, n(cube)) --> [cube].
n(0.25, n(square)) --> [square].

a(0.56, a(blue)) --> [blue].
a(0.27, a(green)) --> [green].
a(0.17, a(red)) --> [red].

det(1.0, det(the)) --> [the].

p(1.0, p(on)) --> [on].

私はそれを機能させることができません:どんな助けもいただければ幸いです。

編集:投稿されたすべてのコード

4

3 に答える 3

1

問題はコードの他の場所にあると思います。これはSWIで私のために働きました:

:- dynamic s/1.

foo --> "hello",   { retractall(s(_)), asserta(s(hi))  }.
foo --> "goodbye", { retractall(s(_)), asserta(s(bye)) }.

例えば:

?- s(X).
false.

?- phrase(foo, "hello").
true .

?- phrase(foo, "hello").
true ;
false.

?- s(X).
X = hi.

?- phrase(foo, "goodbye").
true.

?- s(X).
X = bye.

なぜあなたがこれをしているのか興味があります。私の傾向は、すべてが平等であり、あなたが主張している情報であなたが生成しているASTを増強することです。それからまた、私はダイナミックストアに対して偏見を持っています。

于 2013-02-24T03:56:00.397 に答える
1

私はあなたのコードを完全には理解していませんが、私はこれを感じています:

v(0.65, v(put)) --> {retract(s(V, NP))}, [put].

v(0.35, v(take)) --> {retract(s(V, NP, PP))}, [take].

する必要があります:

v(0.65, v(put)) --> [put], {retract(s(V, NP))}.

v(0.35, v(take)) --> [take], {retract(s(V, NP, PP))}.

しかし、なぜ、、、がVインスタンスNPPPされていないのですか?すべてのオカレンスを削除する場合は、retractall/1;を使用する必要があります。発生が1つしかない場合は、swiplのグローバル変数を使用することをお勧めします。いずれにせよ、DCGで副作用を使用することは、悪魔との契約のようなものです。私は自分のコンパイラでそれをしました、そしてそれは地獄のXDをデバッグしていました

于 2013-02-24T12:37:12.983 に答える
1

これが私がやったことです、私は別のものよりも特定のルールを選択するために制約を使用しました:そしてここにコードがあります:

s(P0, s(V, NP)) --> v(P1, V), np(P2, NP), {P0 is P1*P2*0.35, V == v(take)}.
s(P0, s(V, NP, PP)) --> v(P1, V), np(P2, NP), pp(P3, PP), {P0 is P1*P2*P3*0.65, V == v(put)}.

np(P0, np(D, N)) --> det(P1, D), n(P2, N), {P0 is P1*P2*0.36}.
np(P0, np(D, A, N)) --> det(P1, D), a(P2, A), n(P3, N), {P0 is P1*P2*P3*0.46}.
np(P0, np(D, N, PP)) --> det(P1, D), n(P2, N), pp(P3, PP), {P0 is P1*P2*P3*0.13}.
np(P0, np(D, A, N, PP)) --> det(P1, D), a(P2, A), n(P3, N), pp(P4, PP), {P0 is P1*P2*P3*P4*0.05}.

pp(P0, pp(P, NP)) --> p(P1, P), np(P2, NP), {P0 is P1*P2*1.0, NP \= np(_, _ , _, _)}.

v(0.65, v(put)) --> [put].
v(0.35, v(take)) --> [take].

n(0.23, n(block)) --> [block].
n(0.25, n(circle)) --> [circle].
n(0.15, n(cone)) --> [cone].
n(0.12, n(cube)) --> [cube].
n(0.25, n(square)) --> [square].

a(0.56, a(blue)) --> [blue].
a(0.27, a(green)) --> [green].
a(0.17, a(red)) --> [red].

det(1.0, det(the)) --> [the].

p(1.0, p(on)) --> [on].
于 2013-03-11T05:45:42.353 に答える