Преемник Арифметическая функция 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 за запрос на редактирование.

Другие вопросы по тегам