prolog sum&子使用后继?

时间:2009-04-28 22:31:19

标签: artificial-intelligence prolog

什么是使用后继者的减法和求和,任何人都可以向我展示一个例子,我知道如何以正常的方式去做。

/ * sub(X,Y,Z)---减法* /

sub(X,Y,Z): - add(Y,Z,X)。

1 个答案:

答案 0 :(得分:2)

首先,您需要有一个谓词succ。这就是SWI-Prolog定义它的方式:

succ(?Int1, ?Int2)
    True  if  Int2 = Int1+ 1  and  Int1>=0.     At  least  one  of  the
    arguments must be  instantiated to a natural number.  This predicate
    raises the domain-error not_less_than_zero if called with a negative
    integer.   E.g. succ(X, 0)  fails silently and succ(X, -1) raises  a
    domain-error.

鉴于此,我们可以像这样定义add

add(0, Y, Y).
add(X, Y, Z) :-
  succ(PredX, X),
  add(PredX, Y, PredZ),
  succ(PredZ, Z).

subtract就像这样:

subtract(X, 0, X).
subtract(X, Y, Z) :-
  succ(PredY, Y),
  succ(PredX, X),
  subtract(PredX, PredY, Z).

请注意,其中任何一个都不会处理负数(因为succ没有),因此在Y > X时我没有费心去做减法功能。


编辑:

这是适用于任何实例化模式的addsubtract版本。我仍然不打扰类型检查(如评论中的Kaarel所述)或负数。

add(0, 0, 0).
add(0, Y, Y).
add(X, 0, X).
add(X, Y, Z) :-
  nonvar(X),
  succ(PredX, X),
  (nonvar(Z) -> 
    succ(PredZ, Z), add(PredX, Y, PredZ) 
  ; 
    add(PredX, Y, PredZ), succ(PredZ, Z)
  ).
add(X, Y, Z) :-
  nonvar(Y),
  add(Y, X, Z).

subtract(0, 0, 0).
subtract(X, 0, X).
subtract(X, X, 0).
subtract(X, Y, Z) :-
  add(Y, Z, X).