Prolog 序言,结果正确给出,但打印为false

Prolog 序言,结果正确给出,但打印为false,prolog,dcg,prolog-toplevel,prolog-cut,Prolog,Dcg,Prolog Toplevel,Prolog Cut,例如,我使用以下函数计算二叉树中所有内部节点的集合(至少有一个子节点的节点,即无叶节点) 其结果是 ?- internals(t(3, t(2, t(1, nil, nil), nil), t(5, nil, t(7, nil, nil))), X). X = [3, 2, 5] ; false. 为什么它以false结尾,为什么下面的代码也会这样做,但不会导致false internals(nil,[]). internals(t(_,nil,nil),[]) :- !. internals

例如,我使用以下函数计算二叉树中所有内部节点的集合(至少有一个子节点的节点,即无叶节点)

其结果是

?- internals(t(3, t(2, t(1, nil, nil), nil), t(5, nil, t(7, nil, nil))), X).
X = [3, 2, 5] ;
false.
为什么它以false结尾,为什么下面的代码也会这样做,但不会导致false

internals(nil,[]).
internals(t(_,nil,nil),[]) :- !.
internals(t(X,L,R),[X|Xs]):-
    internals(L,LI), internals(R,RI),
    append(LI,RI,Xs).

?- internals(t(3, t(2, t(1, nil, nil), nil), t(5, nil, t(7, nil, nil))), X).
X = [3, 2, 5].

在第一个示例中,在找到第一个解决方案后,Prolog确定还有其他逻辑路径需要探索(有一个选择点),因此它会提示您使用第一个解决方案。当您输入
您要求Prolog寻求更多解决方案。它没有找到更多的解决方案,因此它输出
false
。这是标准行为。在第二个示例中,在找到第一个解决方案后没有选择点,因此没有给出选择。对于
内部(t(1,nil,nil),[1]),您的剪切版本错误地成功了。
internals(nil,[]).
internals(t(_,nil,nil),[]) :- !.
internals(t(X,L,R),[X|Xs]):-
    internals(L,LI), internals(R,RI),
    append(LI,RI,Xs).

?- internals(t(3, t(2, t(1, nil, nil), nil), t(5, nil, t(7, nil, nil))), X).
X = [3, 2, 5].