首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog:城市之间的追踪路径处于无限循环中。

Prolog:城市之间的追踪路径处于无限循环中。
EN

Stack Overflow用户
提问于 2016-12-07 01:15:13
回答 1查看 117关注 0票数 0

我正在编写一个简单的Prolog程序,跟踪不同城市之间的路线,并返回两件事:距离和城市是否直接相连。我在第一个问题上取得了部分成功,因为如果城市是直接相连的,它就不会返回,但更糟糕的情况是,不可能在城市和程序之间找到一条路线,而不是简单地将错误返回到一个无限循环中,我只是不明白为什么。

守则如下:

road (city1, city2, distance).

代码语言:javascript
复制
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.

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-10 15:51:41

如果您跟踪您的代码,您将看到它进入一个无限循环,因为即使它不能统一前两个distance/3子句,它也始终可以统一distance(A,B,D):- distance(B1,B,D2),因为B1是不绑定的。

更改代码如下:

代码语言:javascript
复制
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. 

测试运行:

代码语言:javascript
复制
[debug]  ?- distance(campinas, test, D).
false.

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

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

代码语言:javascript
复制
[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 

例如,如果不希望这样,可以按以下方式添加!

代码语言:javascript
复制
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. 

测试-运行:

代码语言:javascript
复制
[debug]  ?- distance(campinas, louveira, D).
D = 35.9.

[debug]  ?- 

希望能帮上忙..。trace/0是你的朋友。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41007801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档