即使谓词失败,Prolog也会实例化并分配变量

时间:2016-11-04 14:44:39

标签: prolog

基本问题:当谓词失败时如何分配实例变量?

我有两个谓词“函数”(可能是错误的术语)。第一个谓词使用新的实例化变量(未分配)调用第二个谓词。我为第二个谓词中的新变量赋值。但是,第二个谓词失败了。我实现它的方式,因为谓词失败,新变量在返回第一个谓词后仍然未被赋值。

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

如何在谓词失败时分配实例?

1 个答案:

答案 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) :- ...

这可以让您通过模式匹配来描述不同的情况,保留 以及代码的一般性:您可以将其用作真正的关系,在所有方向,包括最常见的查询,其中所有参数都是自由变量。