我正在尝试使用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>
答案 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))))