基本问题:当谓词失败时如何分配实例变量?
我有两个谓词“函数”(可能是错误的术语)。第一个谓词使用新的实例化变量(未分配)调用第二个谓词。我为第二个谓词中的新变量赋值。但是,第二个谓词失败了。我实现它的方式,因为谓词失败,新变量在返回第一个谓词后仍然未被赋值。
func(X, Y) :-
func2(X, NewX);
write(NewX).
func2(X, NewX) :-
NewX is X+1, false.
打印:
| ?- func(1,1).
_283
但是,如果第二个谓词返回true,那么
func(X, Y) :-
func2(X, NewX),
write(NewX).
func2(X, NewX) :-
NewX is X+1.
然后打印:
| ?- func(1,1).
2
yes
如何在谓词失败时分配实例?
答案 0 :(得分:1)
在Prolog中,当谓词调用失败时,调用后创建的所有变量绑定在回溯时都撤消。因此,在纯Prolog中无法“失败和统一”。
要在纯Prolog中解决您的问题,请以声明方式描述持有的案例。
例如,在您的情况下,您显然有 2种可能的情况:
NewX
相等至X + 1
所以,在Prolog中,这可以是:
integer_successor(X0, X, true) :- X #= X0 + 1.
integer_successor(X0, X, false) :- X #\= X0 + 1.
鉴于这些定义,您现在可以使用:
integer_successor(X, NewX, Truth)
然后使用Truth
来区分案例。
例如:
other_pred(true) :- ...
other_pred(false) :- ...
这可以让您通过模式匹配来描述不同的情况,保留 logical-purity以及代码的一般性:您可以将其用作真正的关系,在所有方向,包括最常见的查询,其中所有参数都是自由变量。