【发布时间】: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), !.这表示如果X和Y是姐妹,那么他们是兄弟姐妹,您不想在X之间寻找更多兄弟姐妹和Y。但这可能会消除您在其他情况下想要的解决方案。为什么要摆脱回溯?这是 Prolog 工作方式的正常部分。 -
只是让输出看起来更整洁。感谢您的解决方案现在完美运行
-
您只需要注意不要为其他查询牺牲有效的解决方案,以获得“更整洁”的输出。 :)