Prolog实例化并分配变量,即使谓词失败
关键问题:当谓词失败时,如何分配实例变量 我有两个谓词“函数”(可能是错误的术语)。第一个谓词使用新的实例化变量(未赋值)调用第二个谓词。我在第二个谓词中为新变量赋值。但是,第二个谓词失败。按照我的实现方式,由于谓词失败,新变量在返回到第一个谓词后仍然未赋值Prolog实例化并分配变量,即使谓词失败,prolog,logical-purity,Prolog,Logical Purity,关键问题:当谓词失败时,如何分配实例变量 我有两个谓词“函数”(可能是错误的术语)。第一个谓词使用新的实例化变量(未赋值)调用第二个谓词。我在第二个谓词中为新变量赋值。但是,第二个谓词失败。按照我的实现方式,由于谓词失败,新变量在返回到第一个谓词后仍然未赋值 func(X, Y) :- func2(X, NewX); write(NewX). func2(X, NewX) :- NewX is X+1, false. 这张照片是: | ?- func(1,1). _283 但是
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
谓词失败时如何分配实例?在Prolog中,当谓词调用失败时,调用后创建的所有变量绑定都会在回溯时撤消。因此,在纯Prolog中没有“失败和统一”的方法
要用纯Prolog解决您的问题,请声明性地描述适用的案例 例如,在您的案例中,您显然有两个可能的案例:
- 任一
等于NewX
X+1
- 或它不是
integer_successor(X0, X, true) :- X #= X0 + 1.
integer_successor(X0, X, false) :- X #\= X0 + 1.
根据这些定义,您现在可以使用:
integer_successor(X, NewX, Truth)
然后使用真理
来区分案例
例如:
other_pred(true) :- ...
other_pred(false) :- ...
这使您可以通过模式匹配来描述不同的情况,并保留代码的通用性和通用性:您可以在各个方向将其用作真实关系,包括所有参数都是自由变量的最一般查询