我试图在Prolog中做一些非常简单的事情,但由于某种原因,它无法正常工作,我无法弄清楚原因。我正在使用SWI。
我有一堆块,标记为a到f,并且它们全部堆叠在一起,一个位于底部,一个位于顶部。像这样:
on(b, a).
on(c, b).
on(d, c).
on(e, d).
on(f, e).
above(X, Y) :- on(X, Y).
above(X, Y) :- on(X, Z), above(Z, Y).
因此,如果其下方的某个块位于该块的顶部,则一个块位于另一个块之上。对我有意义。
所以现在我想定义一个谓词,它告诉我某个块下面是否正好有3个块。在我的例子中,这将是块d。所以我开始:
exactlyThree(X) :- above(X, Y), above(Y, Z), above (Z, W), \+ above(W, _).
如果X在块Y之上,如果Y在块Z之上,如果Z在块W之上并且块W不在任何块之上,则X在其下方有三个块。 但那不起作用。
所以我尝试了这个,这几乎是一样的:
bottomBlock(X) :- \+ above(X, _).
exactlyThree(X) :- above(X, Y), above(Y, Z), above (Z, W), bottomBlock(W).
那也没有用。作为测试它尝试了:
?-bottomBlock(a).
true.
有道理,但后来我尝试了:
?-bottomBlock(X).
false.
这里发生了什么?为什么没有prolog说X = a?为什么我的谓词不能做他们应该做的事情呢?
答案 0 :(得分:0)
从底部开始(呵呵):
?-bottomBlock(X). false.
为什么没有prolog说X = a?
因为它不会发明事物以匹配变量。你需要断言某事,而不仅仅是否定。
bottomBlock(X) :- on(_, X), \+ above(X, _).
exactlyThree(X) :- above(X, Y), above(Y, Z), above (Z, W), \+ above(W, _).
这应该匹配3个或更多块:如果X高于Y,则可能是10个块以上。您需要使用on
才能保证距离正好3个街区。