Artificial intelligence 序言和;转用继承人?

Artificial intelligence 序言和;转用继承人?,artificial-intelligence,prolog,Artificial Intelligence,Prolog,什么是使用后继者的减法和求和,有谁能给我举个例子,说明我知道如何用正常的方法进行减法和求和 /*sub(X,Y,Z)——减法*/ sub(X,Y,Z):-添加(Y,Z,X)。首先,您需要有一个谓词succ。以下是SWI Prolog对其的定义: succ(?Int1, ?Int2) True if Int2 = Int1+ 1 and Int1>=0. At least one of the arguments must be instantiat

什么是使用后继者的减法和求和,有谁能给我举个例子,说明我知道如何用正常的方法进行减法和求和

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


sub(X,Y,Z):-添加(Y,Z,X)。

首先,您需要有一个谓词
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(X, 0, X).
subtract(X, Y, Z) :-
  succ(PredY, Y),
  succ(PredX, X),
  subtract(PredX, PredY, Z).
然后像这样减去:

add(0, Y, Y).
add(X, Y, Z) :-
  succ(PredX, X),
  add(PredX, Y, PredZ),
  succ(PredZ, Z).
subtract(X, 0, X).
subtract(X, Y, Z) :-
  succ(PredY, Y),
  succ(PredX, X),
  subtract(PredX, PredY, Z).
请注意,这两个函数都不能处理负数(因为
succ
不能处理负数),因此当
Y>X
时,我没有费心做减法函数


编辑: 这里有一个版本的
add
subtract
,可以处理任何实例化模式。我仍然不需要进行类型检查(正如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).

首先,您需要有一个谓词
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(X, 0, X).
subtract(X, Y, Z) :-
  succ(PredY, Y),
  succ(PredX, X),
  subtract(PredX, PredY, Z).
然后像这样减去:

add(0, Y, Y).
add(X, Y, Z) :-
  succ(PredX, X),
  add(PredX, Y, PredZ),
  succ(PredZ, Z).
subtract(X, 0, X).
subtract(X, Y, Z) :-
  succ(PredY, Y),
  succ(PredX, X),
  subtract(PredX, PredY, Z).
请注意,这两个函数都不能处理负数(因为
succ
不能处理负数),因此当
Y>X
时,我没有费心做减法函数


编辑: 这里有一个版本的
add
subtract
,可以处理任何实例化模式。我仍然不需要进行类型检查(正如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).

请注意,实例化模式add(-,+,+)和add(+,-,+)在此定义下不起作用。另外,您可以在“add(0,Y,Y)”之后剪切,并检查输入类型,当前为:?-add(0,blah,R)。R=废话;false。实际上,add(+、-、+)确实有效,因为在Y上从未调用succ。但是,请参阅我的编辑。?-add(2,X,3)。错误:succ/2:参数未充分实例化请注意,实例化模式add(-,+,+)和add(+,-,+)在此定义下不起作用。另外,您可以在“add(0,Y,Y)”之后剪切,并检查输入类型,当前为:?-add(0,blah,R)。R=废话;false。实际上,add(+、-、+)确实有效,因为在Y上从未调用succ。但是,请参阅我的编辑。?-add(2,X,3)。错误:成功/2:参数未充分实例化