Prolog列表递归-递归创建列表尾部



作为一个整体,我对声明性编程很陌生,并且很难理解如何正确地递归创建"移动">使用尾部递归。在Prolog中,我已经漫无目的地修补了几个小时,false/gtrace只能告诉我这么多。如果有任何建议,我将不胜感激!

% Recursive Step
path([LF1, LH1, B1, RF1, RH1], [LF2, LH2, B2, RF2, RH2], Explored, Moves) :- 
move([LF1, LH1, B1, RF1, RH1], [LF3, LH3, B3, RF3, RH3]),
not(member([LF3, LH3, B3, RF3, RH3], Explored)),
path([LF3, LH3, B3, RF3, RH3],
[LF2, LH2, B2, RF2, RH2],
[[LF3, LH3, B3, RF3, RH3]|Explored],
[[[LF3, LH3, B3],[LF1, LH1, B1]] | Moves]).
% Solution found
path([LF,LH,B,RF,RH],[LF,LH,B,RF,RH],[], []).

solve(P) :- path([3,3,1,0,0],[0,0,0,3,3], _, P).

对于路径/4,请使用此通用定义!

solve(Path) :-
path(move, Path, [3,3,1,0,0],[0,0,0,3,3]).

反过来做:

path([LF1, LH1, B1, RF1, RH1], [LF2, LH2, B2, RF2, RH2], 
Explored, [[[LF3, LH3, B3],[LF1, LH1, B1]] | Moves]) :- 
move([LF1, LH1, B1, RF1, RH1], [LF3, LH3, B3, RF3, RH3]),
not(member([LF3, LH3, B3, RF3, RH3], Explored)),
path([LF3, LH3, B3, RF3, RH3],
[LF2, LH2, B2, RF2, RH2],
[[LF3, LH3, B3, RF3, RH3]|Explored],
Moves).
path([LF,LH,B,RF,RH],[LF,LH,B,RF,RH],[], []).

这将以自上而下的方式构建列表。

(我没有仔细查看您的代码,只是参考了您的要求(。

最新更新