Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables Prolog-分支警告中的单例变量_Variables_Prolog_Singleton - Fatal编程技术网

Variables 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

您好,这是我在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,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).