2016-11-26 70 views
1

是否可以在DCG中創建如下的傳遞函數?或者將它與DCG規則結合起來?DCG中的傳遞函數

genx(A,B) :- gen(A,B). 
genx(A,C) :- gen(A,B), genx(B,C). 
gen(a,b). 
gen(b,c). 

我會解釋我想要做的正是:

如果我有這樣的語法:

noun_phrase(D,N) --> det(D), noun(N). 
noun(n(cat)) --> [cat]. 

我要讓一樣,如果我想在Nnoun(N)一些限制成爲一種動物。所以,我可以使用這樣的事情:

noun_phrase(np(D,N)) --> det(D), noun(N), genx(N, animal). 

當一隻貓的信息是動物是從一些事實推斷的一樣:

gen(cat,pet). 
gen(pet,animal). 

感謝

回答

0

不知道到已瞭解。

如果我沒有錯,從形式上看規則

genx(A,B) :- gen(A,B). 
genx(A,C) :- gen(A,B), genx(B,C). 

可以在DCG語法寫成

genx --> gen. 
genx --> gen, genx. 

,並用事實說話,

gen(a, b). 
gen(b, c). 

genx(a, c)應該返回true。

但是,DCG中的A,B,C是打算列出的。

我不知道是否合理使用DCG(這是爲了解析)以這種方式來實現代數規則。

+0

感謝您的回答,但它似乎並沒有工作!你能給出更明確的答案嗎? – user2598997

+0

@ user2598997 - 你用的是什麼prolog?我看到它使用gprolog和swi-prolog。如果列表不是問題,你可以嘗試改變'gen([a],[b])。和'gen([b],[c])中的事實。 'genx([a],[c])'應該返回true。 – max66

+0

我正在使用swi-prolog(在線vserion)。 genx(A,B) - > gen(A,B)。 genx(A,C) - > gen(A,B),genx(B,C)。 gen([a],[b])。 gen([b],[c])。給出這個錯誤:程序'genx(A,B)'不存在。 – user2598997