【发布时间】:2018-12-25 20:37:02
【问题描述】:
为了理解Prolog中的cut-fail组合,我找到了下面这个例子,开始玩起来:
enjoys(vincent,X) :- big_kahuna_burger(X),!,fail.
enjoys(vincent,X) :- burger(X).
burger(X) :- big_kahuna_burger(X).
burger(X) :- big_mac(X).
burger(X) :- whopper(X).
big_kahuna_burger(b).
big_mac(a).
whopper(d).
我尝试了两种不同的查询。
在查询 1:enjoys(vincent,b) 中,结果是 SWI-Prolog 输出 false 这是预期的行为并且它停止了,不问我是否要它搜索更多的解决方案。
在查询 2:enjoys(vincent,a),第一个 SWI-Prolog 输出 true,这又是预期的,但随后它让我可以选择单击 "next" 并尝试找到另一个解决方案,然后输出false。
为什么它让我可以选择在第二个查询期间检查另一个解决方案,但在第一个查询中却没有?
【问题讨论】:
-
如果它返回
false,这意味着它已经彻底搜索过了,这意味着绝对没有解决方案,因此在false之后,没有解决方案可以找不到了。 -
那为什么在第一个查询中也没有返回 false 呢?
-
false不是解决方案,false表示它进行了详尽的搜索,但没有找到任何东西。大多数 Prolog 系统会打印false(或no)以表明查询已结束。 -
在第一个例子中,由于没有解决方案,所以没有理由提示您进一步搜索。已经确定没有解决方案。在第二个示例中,找到解决方案的成功逻辑路径留下了一个选择点,这是规则中的一个点,Prolog 可以继续探索以找到其他解决方案。没有找到任何进一步的解决方案,它说“假”。
-
@marc-s 我不得不回滚您的编辑,因为除了修复一个微不足道的错字之外,它还以多种方式打破了这个问题。 Prolog 不会“返回”选项作为其查询用户交互的一部分,它确实将它们“提供”给用户,就像 OP 最初写的那样。最好不要干涉你没有足够能力判断结果的情况,你不同意吗?例如,我永远不会尝试改进任何半连贯的帖子,例如sql-server 标记,永远。干杯。