Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog 序言:追踪城市之间的路线是无限循环的_Prolog_Infinite Loop - Fatal编程技术网

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

Prolog 序言:追踪城市之间的路线是无限循环的,prolog,infinite-loop,Prolog,Infinite Loop,我正在编写一个简单的Prolog程序,用于跟踪不同城市之间的路线,并返回两个结果:距离和城市是否直接相连。 我在第一个问题上取得了部分成功,因为如果城市直接相连,它不会返回,但更糟糕的情况是,当无法跟踪城市之间的路线时,程序会陷入无限循环,而不是简单地返回false,我就是不明白为什么 代码如下: 道路(城市1、城市2、距离)。 我做错了什么?如果你追踪你的代码,你会发现它进入了一个无限循环,因为即使它不能统一前两个distance/3子句,它也可以统一距离(A,B,D):-距离(B1,B,D2

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

代码如下:

道路(城市1、城市2、距离)。


我做错了什么?

如果你追踪你的代码,你会发现它进入了一个无限循环,因为即使它不能统一前两个
distance/3
子句,它也可以统一
距离(A,B,D):-距离(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. 
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.

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

[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 
如果您不想这样做,您可以添加
如下所示:

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. 
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.

[debug]  ?- 

希望对你有帮助
trace/0
是你的朋友。

如果你跟踪你的代码,你会发现它进入了一个无限循环,因为即使它不能统一前两个
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. 
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.

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

[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 
如果您不想这样做,您可以添加
如下所示:

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. 
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.

[debug]  ?- 

希望对你有帮助
trace/0
是您的朋友。

这里似乎有一个输入错误“not(conectas(a,B),),”。它必须不是(连接(A,B,))。并引入一个切入距离(a,B,0):-a==B,!。为了避免回溯。修复了它,结果仍然是
出本地堆栈
。发生了什么事?看起来这里有一个拼写错误“不是(连词(a,B),),”。它必须不是(连接(A,B,))。并引入一个切入距离(a,B,0):-a==B,!。为了避免回溯。修复了它,结果仍然是
出本地堆栈
。发生什么事了?非常感谢,真的很有效。这也帮助我理解了很多我不知道的关于Prolog如何工作的事情。非常感谢,它真的工作了。这也帮助我理解了许多我不知道的关于Prolog如何工作的事情。