我有一个递归谓词,可以构建一个类似于它的列表,问题是它最终会启动并将其展开。并给我一个空列表,linha
谓词没问题,它给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.
答案 0 :(得分:0)
您需要按如下方式进行更改:
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)] .
在跟踪中,您提供了查询actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], N).
由于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,