实现我自己的后继谓词

时间:2015-01-23 21:26:15

标签: prolog clpfd

我知道Prolog有自己的谓词可以处理继任者,但我想自己做运动。

以下是我目前的积极接班人的代码:

successor(0,1).
successor(X,Y) :-
    X > 0,
    Xx is X-1;
    successor(Xx,Yx),
    Y is Yx + 1.

当我输入successor(O,1)时, 我有true successor(O,X)返回 X = 1 successor(X,1)返回 X = 0 successor(2,X)返回 X = 3

我不能做的最后一件事是

successor(X,2)

它引发错误:

ERROR: >/2: Arguments are not sufficiently instantiated

我做了一个跟踪,发现它正在将未初始化的变量(X)与0进行比较

这是因为我要求这个,但我不知道如何解决这个问题以使最后一次通话工作仍然有其他工作。

3 个答案:

答案 0 :(得分:3)

使用

:- use_module(library(clpfd)).

我们这样定义successor/2

successor(X0,X1) :-
   X0 #>= 0,
   X1 #= X0 + 1.

示例查询:

?- successor(_,0).
false.

?- N #< 0, successor(N,_).
false.

?- successor(X,1).
X = 0.

?- successor(X,2).
X = 1.

?- successor(2,X).
X = 3.

?- successor(X,Y).
X in 0..sup, X+1 #= Y.

答案 1 :(得分:1)

为什么您的代码关心标志?你在这里有3个基本案例,其中没有一个特别关注你在数字线上的零位置:

  • 绑定X;绑定Y
  • 绑定X;未绑定的Y
  • 未绑定X;绑定Y

为此......

successor(X,Y) :- int(X), int(Y), Y =:= X+1 .
successor(X,Y) :- int(X), var(Y), successor_x(X,Y) .
successor(X,Y) :- var(X), int(Y), predecessor_y(X,Y) .

successor_x(X,Y) :- T is X+1 , ( Y = T ; successor_x(T,Y) ) .

predecessor_y(X,Y) :- T is Y-1 , ( X = T ; predecessor_y(X,Y) ) .

答案 2 :(得分:0)

使用此代码

    successor(X,Y) :- var(X) -> X is Y - 1 ; Y is X + 1.

首先检查X是否绑定,然后将X实例化为Y - 1,否则直接将Y打印为X + 1.

    ?- successor(90,L).
    L = 91.

    ?- successor(L,90).
    L = 89.

    ?- successor(L,-90).
    L = -91.

    ?- successor(-90,L).
    L = -89.