2016-11-13 3 views
1

I Gitter basierend Karte hat, und ich versuche, ein Prädikat zu entwickeln, die mir den diagonalen Abstand zwischen zwei Punkten gibt, ist es das, was ich habe,Prolog, diagonal Abstand

dist_diagonal((X,Y),(X,W),Passos,D):- 
    dist_ortogonal((X,Y),(X,W),D1), 
    D is D1 + Passos. 

dist_diagonal((X,Y),(Z,Y),Passos,D):- 
    dist_ortogonal((X,Y),(Z,Y),D1), 
    D is D1 + Passos. 

dist_diagonal((X,Y),(Z,W),Passos,_):- 
    X>Z, 
    Y<W, 
    Passos1 is Passos+1, 
    X1 is X-1, 
    Y1 is Y+1, 
    dist_diagonal((X1,Y1),(Z,W),Passos1,_). 

dist_diagonal((X,Y),(Z,W),Passos,_):- 
    X<Z, 
    Y<W, 
    Passos1 is Passos+1, 
    X1 is X+1, 
    Y1 is Y+1, 
    dist_diagonal((X1,Y1),(Z,W),Passos1,_). 

aber wenn ich versuche, testen:

dist_diagonal((5,4),(3,8),0,D). 

ich true anstelle eines Wertes für D

Was mit meinem Prädikat falsch?

PS: Ich sollte hinzufügen, dass ich werde dies mit Punkten nur verwenden, die Y<Z verrify. PS2: Beachten Sie, dass ich die Entfernung mit 8 Arten von Bewegungen berechnen, nicht die euklidische Distanz. Diagonal distance

Antwort

0

Sie müssen schreiben: dist_diagonal((X,Y),(Z,W),Passos,D):- statt dist_diagonal((X,Y),(Z,W),Passos,_):-

Ihr Prädikat wahr zurückgibt, da D alles sein könnte (da Sie anonyme Variablen ‚_‘).

Sie müssen also schreiben:

dist_diagonal((X,Y),(Z,W),Passos,D):- 
    X>Z, 
    Y<W, 
    Passos1 is Passos+1, 
    X1 is X-1, 
    Y1 is Y+1, 
    dist_diagonal((X1,Y1),(Z,W),Passos1,D). 

dist_diagonal((X,Y),(Z,W),Passos,D):- 
    X<Z, 
    Y<W, 
    Passos1 is Passos+1, 
    X1 is X+1, 
    Y1 is Y+1, 
    dist_diagonal((X1,Y1),(Z,W),Passos1,D). 

ich nicht in der Lage war, da ich keine Definition von dist_ortogonal/3 Prädikat haben zu testen, aber ich eine einfache Version davon geschrieben und es funktionierte so sollte es funktioniert gut werden.

+0

Vielen Dank !!!! – user3636673

+0

Froh, dass geholfen hat !! – coder