我正在检查图表是否已连接,并且出于某种原因在它应该为真时变为假。
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])中的每个节点是否都已连接。我应该成真,但不能查明我的错误,我尝试过使用跟踪,但它没有帮助。
答案 0 :(得分:0)
正如CapelliC所述,您需要在列表周围添加方括号:[A | L]而不是A | L和[Head | Y]而不是Head | Y.
第二个问题是checkConnect中的终止条件:
checkConnect([],[]).
只要两个参数都可以与空列表匹配,就指定它为true。但是,checkConnect的第一个参数用于调用isConnected,因此意味着是一个字符,而不是您在终止条件中指定的列表。换句话说,checkConnect永远不会匹配其停止条件。
您正在寻找的是:
checkConnect(_,[]).
(我们使用通配符_因为我们不关心此时访问变量)