检查图表是否已连接

时间:2016-03-18 05:14:28

标签: prolog transitive-closure

我正在检查图表是否已连接,并且出于某种原因在它应该为真时变为假。

allConnected([]).
allConnected(A|L) :- checkConnect(A,L), allConnected(L).

checkConnect([],[]).
checkConnect(X, Head|Y) :- isConnected(X,Head), checkConnect(X,Y).
isConnected(X,Y) :- edge(X,Y); edge(Y,X).

edge(a,b).
edge(b,c).
edge(c,a).

我为谓词做的是检查allConnected([a,b,c])中的每个节点是否都已连接。我应该成真,但不能查明我的错误,我尝试过使用跟踪,但它没有帮助。

1 个答案:

答案 0 :(得分:0)

正如CapelliC所述,您需要在列表周围添加方括号:[A | L]而不是A | L和[Head | Y]而不是Head | Y.

第二个问题是checkConnect中的终止条件:

checkConnect([],[]).

只要两个参数都可以与空列表匹配,就指定它为true。但是,checkConnect的第一个参数用于调用isConnected,因此意味着是一个字符,而不是您在终止条件中指定的列表。换句话说,checkConnect永远不会匹配其停止条件。

您正在寻找的是:

checkConnect(_,[]).

(我们使用通配符_因为我们不关心此时访问变量)