2016-10-17 3 views

ответ

0

Подумайте об этом так:

Если вы хотите, чтобы найти моды из 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)). Используется многократная минусовая логика. Если сначала удаляет второй из первого, а затем проверяет, если вначале меньше второго. Если да, рекурсивно вызовите функцию 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 за запрос на редактирование.

+0

Хотя этот код может помочь решить проблему, он не объясняет _why_ и/или _how_, он отвечает на вопрос. Предоставление этого дополнительного контекста значительно улучшит его долгосрочную образовательную ценность. Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, включая ограничения и допущения. –

Смежные вопросы