【问题标题】:Prolog backtracks and executes other statements tooProlog 也回溯并执行其他语句
【发布时间】:2014-04-07 01:28:17
【问题描述】:

假设您有以下事实:

sister(susan, jane).
sister(karren,holtby).
parent_of(susan,karren).
parent_of(susan,holtby).

以及以下定义:

sibling(X, Y) :-
      sister(X, Y).

sibling(X, Y) :-
      parent_of(Z, X), parent_of(Z, Y).

目标sibling(susan, jane) 给出一个真然后一个假有什么理由吗?两个定义都用了吗?

有没有办法只检查所有定义是否为真,如果是则输出真?

【问题讨论】:

  • 当我用你的代码尝试sister(susan, jane). 时,我得到了“真”。你的意思是sibling(susan, jane).?如果是这样,那将产生“真”,但是有一个选择点来检查更多的解决方案。如果你说,“检查更多”按;,那么它会返回“假”,因为没有更多的解决方案。
  • 是的,对不起,我有一个错字。它应该是兄弟姐妹(苏珊,简)。我理解回溯,但有什么办法可以防止它发生吗?
  • 您可以添加剪辑:sibling(X, Y) :- sister(X, Y), !. 这表示如果 XY 是姐妹,那么他们是兄弟姐妹,您不想在 X 之间寻找更多兄弟姐妹和Y。但这可能会消除您在其他情况下想要的解决方案。为什么要摆脱回溯?这是 Prolog 工作方式的正常部分。
  • 只是让输出看起来更整洁。感谢您的解决方案现在完美运行
  • 您只需要注意不要为其他查询牺牲有效的解决方案,以获得“更整洁”的输出。 :)

标签: prolog logic predicate


【解决方案1】:

Prolog 是一种基于树的语言。让我们建立一个知识库

male(mark).
female(mary).
female(beth).
brother(mark, mary). %mark is the brother of mary
brother(mark, beth).

%define sister
sister(X,Y) :-
  female(X),
  male(Y),
  brother(Y,X).

在这种情况下,子句 Sister 将被评估为:

  • 将 mary 绑定到 X
  • 将标记绑定到 Y
  • 检查知识库的兄弟(马克,玛丽)
  • 如果找到,则返回 true
  • 将 beth 绑定到 X
  • 将标记绑定到 Y
  • 查看兄弟(mark, beth)的知识库
  • 如果找到,则返回 true
  • 不存在其他绑定,因此返回 false

在 Prolog 中尝试了所有可能性。它将返回所有真实的案例,直到找不到一个,然后它会自动返回 false(即没有什么可以满足这一点)。这就是 prolog 的优势和困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 2012-03-18
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多