我有一个递归谓词,它构建了一个适合它的列表,问题是它最终会开始‘去构建它’并给我一个空列表,linha谓词是ok的,它给Vel和Or一个值。
actualizarveiculos(_,[],D).
actualizarveiculos(Tempo,[(X,Y)|RestoVeiculos],NovaVeiculos):-
linha(Y,Or,Vel),
faz_andar_veic(Or,(X,Y),C,mod(Tempo,Vel)),
append(NovaVeiculos,[C],D),
actualizarveiculos(Tempo,RestoVeiculos,D).
faz_andar_veic(90,(X,Y),(X+1,Y),0).
faz_andar_veic(270,(X,Y),(X-1,Y),0).
faz_andar_veic(_,(X,Y),(X,Y),C):-
C=\=0.发布于 2016-11-11 14:44:38
您需要将其更改如下:
actualizarveiculos(_,[],D, D).
actualizarveiculos(Tempo,[(X,Y)|RestoVeiculos],Acc, Res):-
Or is 2,
Vel is 2,
faz_andar_veic(Or,(X,Y),C,mod(Tempo,Vel)),
append(Acc,[C],D),
actualizarveiculos(Tempo,RestoVeiculos,D, Res).
faz_andar_veic(90,(X,Y),(X+1,Y),0).
faz_andar_veic(270,(X,Y),(X-1,Y),0).
faz_andar_veic(_,(X,Y),(X,Y),C):-
C=\=0.测试运行:
[debug] ?- actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], [], Res).
Res = [ (-5, 3), (-4, 4), (-4, 5)] .在您提供的跟踪中,由于N是未绑定的,所以您可以查询actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], N).,然后NovaVeiculos变成解绑定,然后是:append(NovaVeiculos,[C],D),,它可能没有执行您认为它所做的事情,或者至少没有完成您想要做的事情。它所做的是尝试将一个未绑定变量附加到一个列表中,结果与另一个未绑定变量相统一,该变量显然可以给出无限多的解,例如:
[debug] ?- actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], N).
N = [] ;
N = [_G3430] ;
N = [_G3430, _G3436] ;
N = [_G3430, _G3436, _G3442] ;
N = [_G3430, _G3436, _G3442, _G3448] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466, _G3472] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466, _G3472, _G3478] ;
N = [_G3430, _G3436, _G3442, _G3448, _G3454, _G3460, _G3466, _G3472, _G3478|...] ;希望它有帮助,如果你有问题,评论。由于您没有提供linha/3谓词,所以我只是用两个统一来交换它:
Or is 2,
Vel is 2,https://stackoverflow.com/questions/40540474
复制相似问题