рекурсия примитива модуля haskell
Я пытаюсь создать функцию модуля в haskell, используя примитивна рекурсивный функции. Я знаю ,что это возможно (потому что это в списке примеров функций в Википедии)
и я знаю, как я бы логически это сделал.. Но я просто не могу его реализовать!
IE, логика (не примитивная рекурсия или haskell)
function mod(a, b){
while(a > b)
a -= b
return a;
}
который я могу определить с помощью рекурсии (опять же не haskel)
function mod(a, b){
if(a < b) return a;
return mod(a - b, b);
}
но я просто не могу реализуйте его с помощью примитивных рекурсивных функций. Я бит, который я не могу сделать, это логика a
Я думаю, чтобы действительно решить мою проблему, мне нужна какая-то определенная логика, такая как (снова не haskel)
reduce(a, b)
= a >= b -> a-b
otherwise x
Если кто-нибудь может помочь мне с любой частью этого, я был бы очень признателен, спасибо
изменить:: Я думал о потенциальном определении функции модуля с использованием деления, т. е. mod (a, b) = a - (a/b) * b, но так как моя примитивная рекурсивная функция для деления полагается по модулю, я не могу этого сделать, ха-ха
2 ответов
взгляните на это для некоторых указателей:http://www.proofwiki.org/wiki/Quotient_and_Remainder_are_Primitive_Recursive
также обратите внимание, что определение Википедии несколько узкое. Любая функция, построенная индукцией над одной конечной структурой данных, является примитивной рекурсивной, хотя требуется немного, чтобы показать, что это переводится в инструменты, приведенные в Википедии. И обратите внимание, что мы можем представить натуралов в классическом стиле Пеано. Ты не должна этого делать. конечно, но это делает рассуждения об индукции более естественными. См. Вики agda для цитирования этого понятия примитивной рекурсии: http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.Totality#Primitiverecursion
на следующей странице также есть то, что я считаю несколько более ясным изложением примитивной рекурсии:http://plato.stanford.edu/entries/recursive-functions/#1.3
решение
mod(0, y)
= zero(y)
mod(x, 0)
= zero(x)
mod(x + 1, y)
= mult3(succ(mod(x, y)), sign(y), notsign(eq(mod(x, y), diff(y, 1))))