0


0

後継者を使用した減算と合計は何ですか、私はそれを通常の方法で実行する方法を知っているという理由で私に例を示すことができます。

/ * sub(X、Y、Z)---減算* /

sub(X、Y、Z): - (Y、Z、X)を追加します。

1 回答


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`の時に減算機能を作ることを煩わしません。

'' '' '

編集:

これは任意のインスタンス化パターンで動作する 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).