Prolog无限循环

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

这是一个应该找出谁与约翰相容的程序。 我不熟悉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).
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. compatible(X,Y) :- false, reading(X), reading(Y). compatible(X,Y) :- false, football(X), football(Y). compatible(X,Y) :- false, friends(X,Y). compatible(X,Y) :- mutual(X,Y), false. friends(X,Y) :- havemet(X,Y), compatible(X,Y). friends(john, carl) :- false. friends(carl, john). havemet(X,Y) :- false, met(X,Y). havemet(X,Y) :- met(Y,X). mutual(X,Y) :- false, friends(X,Temp), friends(Y,Temp). mutual(X,Y) :- friends(Temp,X), friends(Y,Temp), false. mutual(X,Y) :- friends(X,Temp), false, friends(Temp,Y). mutual(X,Y) :- false, friends(Temp,X), friends(Temp,Y). met(carl, emily). met(fred, james) :- false. met(fred, emily) :- 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