-1

プロローグで後継演算(ペアノ数) のmod/3関数を記述する方法は?

4

1 に答える 1

0

次のように考えてください。

10 と 4 の mod を見つけたい場合は、10 を 4 で割り、リマインダーを返します。ただし、除算は複数の減算であるため、ここでは複数の減算ロジックを使用します。

例: 10 mod 4is same as 10-4 mod 4which is 6 mod 4which is same as as 6-4 mod 4= 2 mod 4. 最初の要素 (2) は 2 番目の要素 (4) より小さいので、ここでプログラムを終了し、最初の要素 (2) を返します。

mod(_, 0, 0).mod 0 はすべて 0 であると言います。

mod(0, _ , 0).0 mod は何でも 0 であると言います。

mod(X, s(0), 0).mod 1 はすべて 0 です。

これはトリッキーな部分です:

mod(A, B, N) :- minus(A, B, R), (R @< B -> N = R ; mod(R, B, N)).これは、複数のマイナス ロジックを使用します。If first は first から second を削除し、次に first が second より小さいかどうかをチェックします。そうであれば、mod 関数を再帰的に呼び出します。そうでない場合は、最初の要素を返します。

s(0).
s(X):- X.

plus(0, Y, Y).
plus(s(X), Y, s(Z)):- plus(X , Y , Z).

minus(A, B, C) :- plus(C, B, A).

mod(_, 0, 0).
mod(0, _ , 0).
mod(X, s(0), 0).
mod(A, B, N) :- minus(A, B, R), (R @< B -> N = R ; mod(R, B, N)).

編集リクエストをありがとう@Toby。

于 2016-10-17T04:58:06.277 に答える