Prolog无限循环
这是一个应该找出谁与约翰相容的程序。 我不熟悉Prolog。为了让Prolog知道,例如met(X,Y)=met(Y,X) 已经编写了很多代码。 现在当我开始查询时Prolog无限循环,prolog,swi-prolog,failure-slice,b-prolog,xsb,Prolog,Swi Prolog,Failure Slice,B Prolog,Xsb,这是一个应该找出谁与约翰相容的程序。 我不熟悉Prolog。为了让Prolog知道,例如met(X,Y)=met(Y,X) 已经编写了很多代码。 现在当我开始查询时 ?- compatible(john, X) 它进入无限循环 源代码: compatible(X,Y) :- reading(X), reading(Y). compatible(X,Y) :- football(X), football(Y). compatible(X,Y) :- friends(X,Y). compatibl
?- compatible(john, X)
它进入无限循环
源代码:
compatible(X,Y) :- reading(X), reading(Y).
compatible(X,Y) :- football(X), football(Y).
compatible(X,Y) :- friends(X,Y).
compatible(X,Y) :- mutual(X,Y).
friends(X,Y) :- havemet(X,Y), compatible(X,Y).
havemet(X,Y) :- met(X,Y).
havemet(X,Y) :- met(Y,X).
mutual(X,Y) :- friends(X,Temp), friends(Y,Temp).
mutual(X,Y) :- friends(Temp,X), friends(Y,Temp).
mutual(X,Y) :- friends(X,Temp), friends(Temp,Y).
mutual(X,Y) :- friends(Temp,X), friends(Temp,Y).
football(john).
football(james).
friends(john, carl).
friends(carl, john).
reading(carl).
reading(fred).
reading(emily).
met(carl, emily).
met(fred, james).
met(fred, emily).
我已经研究了这么多,但我仍然不明白是什么问题,以及如何解决。如果我能帮助我,那就太好了。我对你有一个无限循环并不感到惊讶<代码>兼容取决于
朋友
而朋友
取决于兼容
。你确定这就是你想要的吗
请注意,如果确实希望规则是递归的,则需要一个停止条件。但是我不明白为什么像相似性匹配这样的简单问题需要递归。那么你的程序有什么问题?这里有一种方法可以定位您遇到的问题。通过插入目标
false
我们可以获得一个目标。这是一个与原始程序共享很多属性的片段。特别是:如果故障片循环,则原始程序也会循环。因此,故障片段向我们展示了程序的一部分,它必须被修改以克服原始问题。对于您的查询,我得到了仍然没有终止的以下片段:
?- compatible(john, X), false.
如果这还不够好,您可以将goals
V=const
添加到程序中。但我认为这应该足够了…您使用的是什么Prolog系统?您是否需要使用特定的系统
您的程序不会以标准的Prolog终止,而是以支持表格的Prolog终止,例如XSB Prolog或B-Prolog-只需添加:-auto_table.
作为程序的第一行
| ?- compatible(john, X).
compatible(john, X).
X = john ?;
X = james ?;
X = carl ?;
X = emily ?;
no
你可能是说兼容(约翰,X)?(大写X)?是的,输入错误,很抱歉,事实上,递归关系是我的一个练习的要求,但我只是想理解问题,而不是抛出问题让别人帮我做,无论如何,非常感谢。对于SWI Prolog,请在代码开头添加:
:-使用_模块(库(表格)). :- 桌上好友/2、兼容/2、相互/2、havemet/2、met/2、足球/1、阅读/1。
| ?- compatible(john, X).
compatible(john, X).
X = john ?;
X = james ?;
X = carl ?;
X = emily ?;
no