Variables Prolog-分支警告中的单例变量
您好,这是我在Prolog中的代码:Variables Prolog-分支警告中的单例变量,variables,prolog,singleton,Variables,Prolog,Singleton,您好,这是我在Prolog中的代码: arc(a,h). arc(b,c). related_to(X, Ys) :- setof(Y, arc(X, Y), Ys). cut([H|T],Y) :- check(H,Y), T = [] -> cut(T,Y). check(X,Y) :- related_to(X,Xs), member(Y,Xs) -> write('There is a road'); cut(Xs
arc(a,h).
arc(b,c).
related_to(X, Ys) :-
setof(Y, arc(X, Y), Ys).
cut([H|T],Y) :-
check(H,Y),
T = [] -> cut(T,Y).
check(X,Y) :-
related_to(X,Xs),
member(Y,Xs) -> write('There is a road');
cut(Xs,Y).
当我试图运行检查(a,b)
时,它不会运行。我明白了
Singleton variable in branch: Xs
当我不使用切割问题时,我不会得到任何错误。如果您能指出我犯了错误的地方并指出修复方法,我将不胜感激。TL;DR:序言是正确的。你真的在认真对待这些信息 您正在以非传统的方式使用if-then-else。出于这个原因,弄清楚发生了什么并不是那么简单。当我说
listing(check)
时,我得到以下信息:
check(A, B) :-
( related_to(A, C),
member(B, C)
-> write('There is a road')
; cut(C, B)
).
所以Prolog对缩进风格不是很感兴趣,相反,它只是寻找操作符。事实上,C
(这是您原来的Xs
)出现在if部分,它与else部分无关。您可能想要的是:
check(X,Y) :-
related_to(X,Xs),
( member(Y,Xs)
-> write('There is a road')
; cut(Xs,Y)
).
不管手头的具体问题是什么,我非常怀疑您的代码是否有意义:Xs
是一个连接节点的列表,但是在这个上下文中您真的需要这个?我不这么认为
为什么不使用来确定连通性:
?- closure0(arc, A, B).
comm(P_2, A,B) :-
( call(P_2, A,B)
; call(P_2, B,A)
).
?- closure0(comm(arc), A, B).
如果您对路径也感兴趣,请使用:
在您展示的代码中,我没有看到单例变量问题。而
检查(a,b)
将永远运行(不会终止)。您正在显示的代码是您实际运行的代码吗?您是否尝试进行跟踪
以查看发生了什么?另外,请注意运算符优先级<代码>,的优先级高于代码>。在你的check
code中,它相当于check(X,Y):-(与(X,Xs)相关),member(Y,Xs)->write('therearoad');cut(Xs,Y)。
因此,如果与(X,Xs)相关的失败,那么它将调用cut(Xs,Y)
,而Xs
未绑定。我想实现直接图:)@SzymonSutek:然后省去命令,谢谢你,它现在正在工作。我有一个问题。当我检查道路是否正确时,我得到的结果是:道路错误。如何避免打印false?false
回答是:没有解决方案。一般来说:在许多程序中添加像write/
这样的副作用内置程序没有多大意义。更好地描述干净的关系。
?- path(comm(arc), Path, A, B).