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) :- ...
这使您可以通过模式匹配来描述不同的情况,并保留代码的通用性和通用性:您可以在各个方向将其用作真实关系,包括所有参数都是自由变量的最一般查询