0

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

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]) 中的每个节点是否都已连接。我应该是真实的,但无法查明我的错误,我尝试使用跟踪,但它没有帮助。

4

1 回答 1

0

正如上面 CapelliC 所说,您需要在列表周围添加方括号:[A|L] 代替 A|L 和 [Head|Y] 代替 Head|Y。

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

checkConnect([],[]).

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

您正在寻找的是:

checkConnect(_,[]).

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

于 2016-03-18T12:07:37.173 回答