Prolog - 试图根据给定的事实确定商店访问的顺序

时间:2015-12-16 04:34:39

标签: prolog

我正在尝试确定某人访问以下商店的顺序,并购买以下商品:

店铺:

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和逻辑编程的新手,所以任何帮助都会非常感激。

1 个答案:

答案 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 /。