无法理解 Prolog DCG

Having trouble understanding Prolog DCG

这是

的新跟进问题

我试图让 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,?).

?意思是不知道写什么。 而且我相信我也有其他错误。 其余代码与上面的书完全一样。 当然我添加 "dance" 部分

有人可以帮我解决这个问题或写一个正确的吗?

查看 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].