2016-11-11 6 views
0

Ich habe ein rekursives Prädikat, das eine Liste erstellt wie es ist, das Problem ist, dass es beginnt es "debuilding" und gibt mir eine leere Liste, das linha Prädikat ist in Ordnung, gibt es ein Wert für Vel und Or.Erstellen einer Liste mit Rekursion mit Prolog

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

+0

Sie nicht das linha Prädikat zur Verfügung gestellt haben, was bedeutet, dass wir es nicht Testlauf kann. Auch wenn Sie Prädikatnamen in Englisch eingeben könnten, die praktisch wären, da "eine Liste wie seine" erstellt, sagt nicht wirklich, wie Sie die Liste erstellen möchten. – Limmen

+0

geben Sie einfach einen Wert zu Vel und Or, und Sie können es testen – user3636673

Antwort

0

Sie müssen es wie folgt ändern:

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. 

Testlauf:

[debug] ?- actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], [], Res). 
Res = [ (-5, 3), (-4, 4), (-4, 5)] . 

Im Trace Sie Sie actualizarveiculos(5, [(-5,3), (-4,4), (-4,5)], N). Abfrage bereitgestellt Da N ungebunden dann NovaVeiculos wird ungebunden und dann tun Sie: append(NovaVeiculos,[C],D), was wahrscheinlich nicht tut, was Sie denken, oder zumindest was Sie beabsichtigten, es zu tun. Was sie tut, ist, dass es eine ungebundene Variable mit einer Liste anzuhängen versucht, und das Ergebnis wird mit einer anderen ungebundene Variable vereinigt, die offensichtlich eine unendliche Anzahl von Lösungen geben kann, zB:

[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|...] ; 

Hoffe, es hilft, kommentieren, wenn Sie habe Fragen. Da Sie das linha/3 Prädikat nicht vorsah tauschte ich es nur mit zwei Vereinheitlichungen:

Or is 2, 
Vel is 2, 
+0

Danke, das war wirklich hilfreich! – user3636673

+0

Wie mache ich das? – user3636673

+0

Klicken Sie auf das Häkchen unter der Antwort – Limmen

Verwandte Themen