2013-02-23 56 views
0

我有這個序言問題,我不能解決。我試圖達到的目的是斷言FACT A,當我輸入時收回事實B:取得並斷言事實B,並在輸入時撤銷事實A.Prolog根據輸入決定一定的規則選擇

即:

:- 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]. 

我無法得到它的工作:任何幫助,將不勝感激。

編輯:所有的代碼張貼

+0

你能還發布你正在嘗試運行的代碼段,這是行不通的? – 2013-02-25 17:22:33

+0

對不起,我一直很忙,沒有時間。我會發佈一個不同的解決方案,但爲我工作,雖然 – macguy 2013-03-05 09:57:22

回答

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]. 
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。再一次,我偏向於動態商店。

+0

謝謝你的回答。當談到prolog我是一個新手:你是什麼意思的AST? – macguy 2013-02-25 01:01:15

+0

抽象語法樹。我真正說的是,當你解析文本時,這個想法是重構某種結構,而這個結構是解析的結果。在解析過程中使用'assert'和'retract'是一個副作用。除了別的以外,我通常會將解析的結果完全包含在結構中,然後讓評估者處理副作用。 – 2013-02-25 05:07:33

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))}. 

但是,爲什麼在VNPPP非實例化?如果你想刪除所有的事件,你應該使用retractall/1;如果只有一次發生,我建議使用swipl's global variables。無論如何,在DCG中使用副作用就像是與魔鬼打交道;我做到了我的編譯器,這是一個調試運行地獄XD

+0

我編輯了我的問題併發布了整個代碼,我試圖做的是刪除語法規則S ---> V NP PP如果輸入動詞是take,並刪除語法規則S ---> V NP如果輸入動詞被放置。 – macguy 2013-02-25 01:07:42