使用Prolog建立Recursion列表

时间:2016-11-11 03:01:08

标签: recursion prolog

我有一个递归谓词,可以构建一个类似于它的列表,问题是它最终会启动并将其展开。并给我一个空列表,linha谓词没问题,它给VelOr一个值。

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.

the trace

1 个答案:

答案 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,