Prolog'Out of Local Stack'

时间:2015-05-18 18:37:13

标签: recursion prolog river-crossing-puzzle

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

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]).但是,这会导致明显无限的递归。我错过了什么?

1 个答案:

答案 0 :(得分:1)

要避免周期,请尝试closure0/3

solution(S) :-
   closure0(move, S,[e,e,e,e,e,e,e,e]).