无法理解Prolog DCG

时间:2015-12-10 05:36:39

标签: prolog dcg

enter image description here

enter image description here

这是https://stackoverflow.com/questions/34170191/confused-about-how-to-use-in-prolog?noredirect=1#comment56112107_34170191

的新后续问题

我试图让9.7中的代码更强大。所以我决定添加一个新的语法

every,man,that,a,woman,loves,dance

答案应该是

all(man(X)&exists(woman(Y)&loves(Y, X)))->dance(1)))

至少我相信这是答案。

我尝试了一些方法,但它不起作用。这是我最后的错误解决方案:

rel_clasue(X,P1,P3)-->[that],determiner(X,P1,P2,P3),noun(X,P1),trans_verb(X,P2,?).

?意味着我不知道该写什么。 我相信我也有其他的错误。 其余代码完全如上所述。 当然我添加“舞蹈”部分

有人可以帮我修理或写一个正确的吗?

1 个答案:

答案 0 :(得分:1)

rel_clause//3看起来你基本上有两个规则:一个空的基本案例和另一个接受一个动词短语的案例。所以当你给它[that,loves,a,woman]时它会起作用:

?- phrase(rel_clause(X, P1, Y), [that,loves,a,woman]).
Y = P1&exists(_G1990, woman(_G1990)&loves(X, _G1990))

但是当你给它一个更复杂的短语时它不起作用:

?- phrase(rel_clause(X, P1, Y), [that,a,woman,loves]).
false.

所以我认为您需要向rel_clause//3添加规则来处理这个问题。我似乎很清楚[that,a,woman,loves][that,loves,a,woman]实际上只是颠倒了这种关系,而在前一种情况下,我们实际上得到的是一个传递动词而没有一个名词跟随它成为直接对象。换句话说,[that,a,woman,loves]在某种程度上类似man(M) & (exists(woman(W)) & loves(W, M),其中[that,loves,a,woman]更像man(M) & (exists(woman(W)) & loves(M, W),其中M和W在love/2结构中交换。

我冒昧地猜测:

rel_clause(X, P1, (P1&P3)) -->
    [that], noun_phrase(Y, P2, P3), trans_verb(Y, X, P2).

这似乎产生了我们想要的解析:

?- phrase(sentence(X), [every,man,that,a,woman,loves,lives]).
X = all(_1, man(_1)&exists(_2, woman(_2)&loves(_2, _1))->lives(_1)) ;

除此之外,dance应为dances,您需要为此制定不及物动词规则:

intrans_verb(X, dances(X)) --> [dances].