我正在编写一个简单的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.我做错了什么?
发布于 2016-12-10 15:51:41
如果您跟踪您的代码,您将看到它进入一个无限循环,因为即使它不能统一前两个distance/3子句,它也始终可以统一distance(A,B,D):- distance(B1,B,D2),因为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] ?- 希望能帮上忙..。trace/0是你的朋友。
https://stackoverflow.com/questions/41007801
复制相似问题