Successor Arithmetic Prolog Mod 函数
Successor Arithmetic Prolog Mod function
如何在序言中为后继算术(皮亚诺数)编写mod/3函数?
这样想:
如果你想找到 10 和 4 的 mod,你将 10 除以 4 和 return 提醒。但由于除法是多次减法,我们将在这里使用多次减法逻辑。
例如:10 mod 4
与 10-4 mod 4
相同,即 6 mod 4
又与 6-4 mod 4
= 2 mod 4
相同。由于第一个元素 (2) 小于第二个 (4),我们在此终止程序并 return 第一个元素 (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)).
这使用了多个减法逻辑。如果首先从第一个中删除第二个,然后检查第一个是否小于第二个。如果是,递归调用mod函数。如果不是return第一个元素。
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 的编辑请求。
如何在序言中为后继算术(皮亚诺数)编写mod/3函数?
这样想:
如果你想找到 10 和 4 的 mod,你将 10 除以 4 和 return 提醒。但由于除法是多次减法,我们将在这里使用多次减法逻辑。
例如:10 mod 4
与 10-4 mod 4
相同,即 6 mod 4
又与 6-4 mod 4
= 2 mod 4
相同。由于第一个元素 (2) 小于第二个 (4),我们在此终止程序并 return 第一个元素 (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)).
这使用了多个减法逻辑。如果首先从第一个中删除第二个,然后检查第一个是否小于第二个。如果是,递归调用mod函数。如果不是return第一个元素。
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 的编辑请求。