我有基于网格的地图,我正在尝试开发一个谓词,它给出了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 :(得分: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
谓词的定义,但我写了一个简单的版本,它起作用,所以应该可以正常工作。