haskell模数原始递归

时间:2011-12-25 13:11:45

标签: haskell functional-programming primitive

我正在尝试使用primtive recursive函数在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);
} 

但我似乎无法使用原始递归函数来实现它。我不能做的是&lt;的逻辑。 B'/ P>

我认为要真正解决我的问题我需要某种定义的逻辑,例如(再次不是哈克尔)

reduce(a, b)
    = a >= b -> a-b 
    otherwise x

如果有人能帮我解决这个问题,我真的很感激,谢谢

编辑:: 我想到可能使用除法定义一个模数函数,即mod(a,b)= a - (a / b)* b,但由于我的原始递归函数除以模数我不能做到哈哈< / p>

2 个答案:

答案 0 :(得分:1)

请看一下这些指示:http://www.proofwiki.org/wiki/Quotient_and_Remainder_are_Primitive_Recursive

另请注意,维基百科的定义有点狭窄。通过归纳在单个有限数据结构上构建的任何函数都是原始递归的,尽管需要一点点来证明这可以转换为维基百科中给出的工具。请注意,我们可以代表经典佩诺诺风格的自然风格。当然,你不必这样做,但它使归纳的推理更加自然。有关原始递归概念的引用,请参阅agda wiki:http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.Totality#Primitiverecursion

以下页面也有我认为对原始递归更清晰的阐述:http://plato.stanford.edu/entries/recursive-functions/#1.3

答案 1 :(得分:0)

解决方法是

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))))