рекурсия примитива модуля 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))))