【发布时间】:2020-06-06 02:05:54
【问题描述】:
black(root).
black(v1).
black(v3).
black(v4).
edge(root,root).
edge(v1,root).
edge(v2,v1).
edge(v3,v1).
edge(v4,v3).
edge(v5,v2).
edge(v5,v4).
edge(v6,v5).
foo(root).
foo(X) :- edge(X,Y), black(Y), foo(Y).
然后我输入foo(X),只得到X=root。
我真的不知道为什么。由于 foo 的第一部分,我们得到了第一个 root。然后我们应该去第二部分,然后我们继续寻找边缘(root,root)。 black(root) 返回 true,foo(root) 也是如此,所以我们得到另一个根 solution。那么我们为什么不去边缘(v1,root)?我错过了什么?
【问题讨论】:
-
你做了一个无限循环,因为对于
foo(root),它每次也可以采取递归情况,与edge(root, root)统一,从而找到另一个解决方案。 Prolog 搜索深度优先,而不是广度优先。
标签: prolog failure-slice