Prolog:城市之间的追踪路线无限循环

时间:2016-12-07 01:15:13

标签: prolog infinite-loop

我编写了一个简单的Prolog程序,用于跟踪不同城市之间的路线并返回两件事:距离,以及城市是否直接连接。 我在第一个问题上取得了部分成功,因为如果城市直接连接,它就不会返回,但最糟糕的情况是,无法跟踪城市和程序之间的路线,而不是简单地返回虚假陷入无限循环,我无法理解为什么。

代码如下:

road (city1, city2, distance).

road(campinas,valinhos,16.9).
road(campinas,paulinia,30.1).
road(campinas,hortolandia,27.6).
road(campinas,holambra,41.1).
road(valinhos,vinhedo,7.8).
road(paulinia,cosmopolis,18.5).
road(hortolandia,sumare,9.1).
road(holambra,santo_antonio_de_posse,16.7).
road(vinhedo,louveira,11.2).
road(sumare,americana,12.3).
road(sumare,santa_barbara_doeste,29.8).
road(louveira,jundiai,12.9).
road(americana,limeira,27.6).
road(limeira,cordeiropolis,14.9).
road(santa_barbara_doeste,piracicaba,28.0).
road(cordeiropolis,araras,21.4).

conects(A,B,D):-road(A,B,D).
conects(A,B,D):-road(B,A,D).

distance(A,B,0):- A == B!.
distance(A,B,D):- conects(A, B, D).
distance(A,B,D):- distance(B1,B,D2), conects(A,B1,D1), not(conects(A,B,_)), D is D1 + D2.

我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果你追踪你的代码,你会看到它进入一个无限循环,因为即使它不能统一前两个distance/3子句,它也总是统一distance(A,B,D):- distance(B1,B,D2),因为{{ 1}}是未绑定的。

按如下方式更改您的代码:

B1

测试运行:

road(campinas,valinhos,16.9).
road(campinas,paulinia,30.1).
road(campinas,hortolandia,27.6).
road(campinas,holambra,41.1).
road(valinhos,vinhedo,7.8).
road(paulinia,cosmopolis,18.5).
road(hortolandia,sumare,9.1).
road(holambra,santo_antonio_de_posse,16.7).
road(vinhedo,louveira,11.2).
road(sumare,americana,12.3).
road(sumare,santa_barbara_doeste,29.8).
road(louveira,jundiai,12.9).
road(americana,limeira,27.6).
road(limeira,cordeiropolis,14.9).
road(santa_barbara_doeste,piracicaba,28.0).
road(cordeiropolis,araras,21.4).

conects(A,B,D):-road(A,B,D).
conects(A,B,D):-road(B,A,D).

distance(A,A,0).
distance(A,B,D):- conects(A, B, D).
distance(A,B,D):- not(conects(A,B,_)), conects(A1, A, D1), A1 \= A, conects(B1, B, D2), B1 \= B, distance(A1, B1, D3),  D is D1 + D2 + D3. 

实际上,它可以通过在同一城市之间移动多次来找到无限的距离:

[debug]  ?- distance(campinas, test, D).
false.

[debug]  ?- distance(campinas, louveira, D).
D = 35.9 

如果您不想要,可以按如下方式添加[debug] ?- distance(campinas, louveira, D). D = 35.9 ; D = 95.49999999999999 ; D = 155.09999999999997 ; D = 214.7 ; D = 274.3 ; D = 333.90000000000003 ; D = 393.50000000000006 ; D = 453.1000000000001 ; D = 512.7 ; D = 572.3 ; D = 631.8999999999999 ; D = 691.4999999999998 ; D = 751.0999999999997 ; D = 810.6999999999996 ; D = 870.2999999999995

!

<强>试验运行:

distance(A,B,D):- not(conects(A,B,_)), conects(A1, A, D1), A1 \= A, conects(B1, B, D2), B1 \= B, distance(A1, B1, D3), !, D is D1 + D2 + D3. 

希望它有帮助...... [debug] ?- distance(campinas, louveira, D). D = 35.9. [debug] ?- 是你的朋友。