【问题标题】:Prolog unification exerciseProlog 统一练习
【发布时间】:2013-09-09 12:01:51
【问题描述】:

我不确定在考试中如何回答这个问题:

让我们考虑这个 prolog 程序:

p(a,b).
p(b,c).
p(c,a).
q(X,X).
q(X,Y):-p(X,Z),q(Z,Y).

和问题:

?- q(X,X).

有效吗?答案是:

上述目标可以通过无数种方式实现,但没有一种是 替换 X = b。

我不明白,真的。 IMO 这个谓词可以通过 3 种方式完成:

 q(a,a) or  q(b,b) or  q(c,c).

我在这里不明白什么?或者也许答案是错误的,我只是浪费时间而我的答案是好的?

【问题讨论】:

  • 查询与其中一条规则相同,所以我认为“无限多路”是正确的。但是没有什么可以阻止替换X=b
  • 但规则包含常量“a”、“b”和“c”,是的,规则与查询相同,因此 IMO 应该只有 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)Were you 发出查询?- q(b,b).?- q(42,42). 两者确实会成功;但这不是所要求的。

标签: prolog


【解决方案1】:

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 的定义;这无关紧要。)

【讨论】:

  • 啊对,这是因为先尝试了 q(X,X),所以我可以 q(X,X) where X = any,但这仍然不排除 X = b,所以这样所谓的“有效”答案是错误的。
  • @Naimads:先尝试什么并不重要。如果子句顺序相反,则回溯会找到反身子句。但给定的答案似乎不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多