无法理解 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].
这是
的新跟进问题我试图让 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].