【问题标题】:Farmer goat wolf and cabbage in Prolog via Breadth First SearchProlog中的农夫山羊狼和卷心菜通过广度优先搜索
【发布时间】:2014-06-16 05:08:18
【问题描述】:

我正在尝试使用广度优先技术解决 Prolog 中的农夫、山羊、狼、卷心菜之谜,但遇到了一些问题。当我尝试收集树的第二级的所有有效组合时,它失败了。这是相关代码,

extend([Node|Path], NewPaths) :-
    bagof([NewNode, Node|Path],
        (s(Node, NewNode), not(member(NewNode, [Node|Path]))),
        NewPaths),
    !.
extend(Path, []).

s(state(X,X,W,C), state(Y,Y,W,C))
    :- opp(X,Y), not(unsafe(state(Y,Y,W,C))).
s(state(X,G,X,C), state(Y,G,Y,C))
    :- opp(X,Y), not(unsafe(state(Y,G,Y,C))). 
s(state(X,G,W,X), state(Y,G,W,Y))
    :- opp(X,Y), not(unsafe(state(Y,G,W,Y))).
s(state(X,G,W,C), state(Y,G,W,C))
    :- opp(X,Y), not(unsafe(state(Y,G,W,C))).
s(state(F,G,W,C), state(F,G,W,C))
    :- fail.

opp(e,w).
opp(w,e).

unsafe(state(X,Y,Y,C)) :- opp(X,Y).
unsafe(state(X,Y,W,Y)) :- opp(X,Y).

not(P) :-
    P, !, fail
    ;
    true.

扩展谓词是我看到问题的地方。当我在第一级运行它时,它工作正常,

?- extend([state(e,e,e,e)],[X]).
X = [state(w,w,e,e),state(e,e,e,e)]

当我运行第二级时,它失败了,

?- extend([state(w,w,e,e)],[X]).
no

它应该返回如下内容,

X = [state(e,w,e,e),state(w,w,e,e),state(e,e,e,e)]

提前感谢您的所有帮助,非常感谢。

问候,

达里安

【问题讨论】:

  • 你看Cannibals/Missionaries这个问题了吗?非常相似。
  • @DanielLyons - 感谢您的链接,它对完成我的程序非常有帮助。

标签: prolog breadth-first-search river-crossing-puzzle


【解决方案1】:

如果我查询你的代码,我会得到

?- extend([state(w,w,e,e)],X).
X = [[state(e, e, e, e), state(w, w, e, e)], [state(e, w, e, e), state(w, w, e, e)]]

X 是一个列表列表。然后我简化了extend/2谓词,

extend([Node|Path], [Node|NewPaths]) :-
    bagof(NewNode,
        (s(Node, NewNode), not(member(NewNode, Path))),
        NewPaths).

我明白了

?- extend([state(w,w,e,e)],X).
X = [state(w, w, e, e), state(e, e, e, e), state(e, w, e, e)].

请注意,我使用[X]查询extend/2。

顺便说一句,这个子句没用

s(state(F,G,W,C), state(F,G,W,C))
    :- fail.

【讨论】:

  • 谢谢,这是让我通过路障的答案。
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
相关资源
最近更新 更多