我正在尝试确定某人访问以下商店的顺序,并购买以下商品:
店铺:
1. kingtoots
2. leftorium
3. sprawlmart
4. trynsave
产品:
1. saxophone
2. dress
3. pacifier
4. slingshot
以下是给定的事实:
1. He bought the saxophone book at King Toots
2. The store he visited immediately after buying the slingshot was not Sprawl-Mart
3. The Leftorium was his second stop
4. Two stops after leaving Try-N-Save, he bought the pacifier
根据给定的信息尝试编写Prolog事实后,我想出了以下内容:
purchase(saxophone, king_toots).
purchase(greendress, X).
purchase(pacifier, X).
purchase(slingshot, X).
store(leftorium, X).
store(king_toots, saxophone).
store(sprawlmart, X).
store(trynsave, X).
stop1(X, Y) :- store(X, Y), purchase(Y, X).
stop2(X, Y) :- store(leftorium, X), purchase(X, leftorium).
stop3(X, Y) :- store(X, Y), purchase(Y, X).
stop4(X, Y) :- store(X, Y), purchase(Y, X).
但是,当我在SWI-Prolog中运行时,我收到以下错误:
2 ?- stop2(X, Y).
ERROR: toplevel: Undefined procedure: stop2/2 (DWIM could not correct goal)
这更像是一个"请指导我正确的方向"写下事实/逻辑而不是"为什么我会收到这个错误。"我是Prolog和逻辑编程的新手,所以任何帮助都会非常感激。
答案 0 :(得分:2)
您的代码有很多关于单例的警告,变量只出现在子句中一次。 Prolog是关于关系的,你应该编写包含真正相关论点的谓词,而单例是无用的。一个简单的解决方案模式可能是
order_stores(L) :-
L =[[_,_,1],
[_,_,2],
[_,_,3],
[_,_,4]],
facts1(L),
facts3(L),
facts4(L),
facts2(L).
facts1(L) :-
member([saxophone,kingtoots,_],L).
...
请注意,fact2 / 1是最后一个:因为Prolog中的简单否定需要实例化参数...否则,请使用dif /。