2016-11-13 6 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

あなたが書く必要がある:Dは何も(匿名変数を使用するため、「_」)可能性があるためdist_diagonal((X,Y),(Z,W),Passos,D):-代わりのdist_diagonal((X,Y),(Z,W),Passos,_):-

あなたの述語がtrueを返しています。

だから、記述する必要があります。

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