Prolog 序言统一练习

Prolog 序言统一练习,prolog,Prolog,我不是舒尔如何在我的考试答案中回答这个问题的: 让我们考虑一下Prolog程序: 问题: ?- q(X,X). 有效吗?答案是: 上述目标有无数种实现方式,但没有一种是这样的 替换X=b 我真的不明白。IMO此谓词可通过3种方式填写: q(a,a) or q(b,b) or q(c,c). 我不明白的是什么?或者可能答案是错误的,我只是浪费时间,而我的答案是好的?这个q(X,X)。规则匹配q的参数相等的任何输入。您可以轻松地亲自尝试: ?- [user]. |: q(X, X). |:

我不是舒尔如何在我的考试答案中回答这个问题的:

让我们考虑一下Prolog程序:

问题:

?- q(X,X).
有效吗?答案是:

上述目标有无数种实现方式,但没有一种是这样的 替换X=b

我真的不明白。IMO此谓词可通过3种方式填写:

 q(a,a) or  q(b,b) or  q(c,c).
我不明白的是什么?或者可能答案是错误的,我只是浪费时间,而我的答案是好的?

这个
q(X,X)。
规则匹配
q
的参数相等的任何输入。您可以轻松地亲自尝试:

?- [user].
|: q(X, X).
|: q(X, Y) :- p(X, Z), q(Z, Y).
|: % user://1 compiled 0.00 sec, 1,808 bytes
true.

?- q(b, b).
true.

?- q(X, X), X=b.
X = b.

您可以在最终查询中填写任何Prolog术语,而不是
b
。(请注意,我甚至还没有在这里输入
p
的定义;这是不相关的。)

该查询与其中一条规则相同,因此我认为“无限多路径”是正确的。但是没有什么可以阻止替换
X=b
。但是规则包含常量“a”、“b”和“c”,而且规则与查询相同,所以在我看来应该只有3个答案。如果p(a,b)和p(b,c)以及p(c,a),那么q(X,X)将有无限多个答案。。。但这只是我的逻辑。也许是不同的。没有什么可以阻止
q(d,d)
q(e,e)
被计算为真。只要两个参数相同,查询将满足规则
q(X,X)
。正确的答案应该是:“查询有无限多个结果”。问题是,发出查询
时会发生什么?-q(X,X)。
。不会产生
q(b,b)
。如果您要发出一个查询
?-q(b,b)。
?-q(42,42)。
这两个查询确实会成功;但这不是问题所在。啊,对了,这是因为q(X,X)是先尝试的,所以我可以q(X,X)其中X=any,但这仍然不排除X=b,所以这个所谓的“有效”答案是错误的。@Naimads:先尝试什么并不重要。如果子句的顺序相反,回溯将找到反身子句。但给出的答案似乎不正确。
?- [user].
|: q(X, X).
|: q(X, Y) :- p(X, Z), q(Z, Y).
|: % user://1 compiled 0.00 sec, 1,808 bytes
true.

?- q(b, b).
true.

?- q(X, X), X=b.
X = b.