Преемник Арифметическая функция Prolog Mod
Как написать функцию mod/3 для арифметики-преемника (числа Пеано) в прологе?
1 ответ
Думайте об этом так:
Если вы хотите найти мод 10 и 4, вы делите 10 на 4 и возвращаете напоминание. Но так как деление - это многократное вычитание, мы будем использовать здесь логику множественного вычитания.
Например: 10 mod 4
такой же как 10-4 mod 4
который 6 mod 4
что опять же как 6-4 mod 4
знак равно 2 mod 4
, Поскольку первый элемент (2) меньше второго (4), мы завершаем программу и возвращаем первый элемент (2).
mod(_, 0, 0).
Говорит, что что-нибудь мод 0 это 0.
mod(0, _ , 0).
Говорит, что 0 мод все равно 0.
mod(X, s(0), 0).
Говорит, что что-нибудь мод 1 равен 0.
Это сложная часть:
mod(A, B, N) :- minus(A, B, R), (R @< B -> N = R ; mod(R, B, N)).
При этом используется логика множественных минусов. Если первый удаляет второе из первого, а затем проверяет, меньше ли первое, чем второе. Если да, рекурсивно вызвать функцию мода. Если нет, верните первый элемент.
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 за запрос на редактирование.