Prolog,对角线距离

时间:2016-11-13 18:27:23

标签: recursion prolog distance

我有基于网格的地图,我正在尝试开发一个谓词,它给出了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

1 个答案:

答案 0 :(得分:0)

您需要写:dist_diagonal((X,Y),(Z,W),Passos,D):-而不是dist_diagonal((X,Y),(Z,W),Passos,_):-

你的谓词返回true,因为D可以是任何东西(因为你使用匿名变量&#39; _&#39;)。

所以你需要写:

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谓词的定义,但我写了一个简单的版本,它起作用,所以应该可以正常工作。