プロローグで後継演算(ペアノ数) のmod/3関数を記述する方法は?
1 に答える
次のように考えてください。
10 と 4 の mod を見つけたい場合は、10 を 4 で割り、リマインダーを返します。ただし、除算は複数の減算であるため、ここでは複数の減算ロジックを使用します。
例: 10 mod 4
is same as 10-4 mod 4
which is 6 mod 4
which 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。