2016-11-13 14 views
1

У меня есть карта сетки на основе, и я пытаюсь создать предикат, который дает мне диагональное расстояние между 2 точками, это то, что у меня есть,Пролога, диагональное расстояние

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,_). 

, но когда я пытаюсь проверить:

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

я получаю true вместо значения для D

Что случилось с моим предикатом?

PS: Я должен добавить, что я буду использовать это только с точками, которые отвергают Y<Z. PS2: Обратите внимание, что я рассчитываю расстояние, используя 8 видов движений, а не эвклидовое расстояние. Diagonal distance

ответ

0

Вам нужно написать: dist_diagonal((X,Y),(Z,W),Passos,D):- вместо dist_diagonal((X,Y),(Z,W),Passos,_):-

Ваш предикат возвращает истину, так как 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). 

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_ortogonal/3 предиката, но я написал простую версию этого, и она работала так, оно должно работать нормально.

+0

Большое спасибо !!!! – user3636673

+0

Рад, что помогло! – coder