1

我正在开发一个程序来解决臭名昭著的谜题“农民、狐狸、鹅和谷物”的更复杂版本,它有八个组成部分而不是四个。我已经确定了解决方案;另外,我只写出了完成问题的必要状态,如下所示:

move([w,w,w,w,w,w,w,w],[e,w,w,e,w,w,w,w]).
move([e,w,w,e,w,w,w,w],[w,w,w,e,w,w,w,w]).

等等

我现在的目标是让这个程序遵循这些状态,从一个到下一个链接,直到达到最终目标[e,e,e,e,e,e,e,e]. 为了做到这一点,我定义了谓词:

solution([e,e,e,e,e,e,e,e],[]).
solution(Start,End) :-
    move(Start,NextConfig),
    solution(NextConfig,End).

我的查询是solution([w,w,w,w,w,w,w,w],[e,e,e,e,e,e,e,e]).但是,这显然会导致无限递归。我错过了什么?

4

1 回答 1

1

为避免循环,请尝试closure0/3

solution(S) :-
   closure0(move, S,[e,e,e,e,e,e,e,e]).
于 2015-05-18T18:45:59.733 回答