Prolog -递归地追加到列表



我写了这个函数,其中我有一组坐标作为参数,我想创建一个新的列表,所有坐标在它们的左边(所以基本上是X-1),但最后它不会问我是否给出的选项是正确的,它只是打印yes。下面是代码:

all_valid_moves([], L):-
write('------------------------'),
nl,
write(L),
nl,
write('------------------------'),
nl,
!.
all_valid_moves([Head|Tail], All_Valid):-
nth0(0, Head, X),
nth0(1, Head, Y),
NewX is X - 1,
append([[NewX, Y]], All_Valid, New_All_Valid),
write(All_Valid),
nl,
all_valid_moves(Tail, New_All_Valid).

测试用例all_valid_moves([[1,1],[2,2],[3,3]], X).。应该返回[[0,1],[1,2],[2,3]]

如果有人能指出我所犯的错误,请指出来!非常感谢你的时间。祝你过得愉快!

最终答案

我给函数添加了一个新的变量,这样我就可以在一个新的列表中返回它,这是最终的结果:

all_valid_moves(Board, [], L, New):-
New = L.
all_valid_moves(Board, [Head|Tail], Previous, All_Valid):-
nth0(0, Head, X),
nth0(1, Head, Y),
NewX is X - 1,
append([[NewX, Y]], All_Valid, New_All_Valid),
all_valid_moves(Board, Tail, New_Prev3, New_All_Valid),
All_Valid = New_All_Valid.

简化,简化,再简化。不需要nth0/3。不需要append/3。就在:

all_valid_moves( []         , []          ) .
all_valid_moves( [[X,Y]|As] , [[X1,Y]|Bs] ) :- X1 is X-1, all_valid_moves(As,Bs).

最新更新