【问题标题】:haskell modulus primitive recursionhaskell 模数原始递归
【发布时间】:2011-12-25 13:11:45
【问题描述】:

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

但我似乎无法使用原始递归函数来实现它。 I bit which I can't do is the logic of a

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

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

如果有人能帮我解决这个问题,我将不胜感激,谢谢

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

【问题讨论】:

  • mod a b | a &lt; b = a | otherwise = mod (a - b) b - 这是对普通递归的简单 Haskell 翻译。
  • @DanBurton 一位用户之前已经发布过此消息,但随后他删除了他的消息,因为它与原始递归函数的上下文并不真正相关

标签: haskell functional-programming primitive


【解决方案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

【讨论】:

  • 谢谢,我已尽力实现这一点,但我不确定“中间”位。链接说“所以我们看到:rem(n+1,m)=(rem(n,m)+1)sgn(m) notsgn(χeq(rem(n,m),m−˙1))”但是是什么连接 (rem(n, m) + 1) 和 sgn(m) 和 notsgn() ?没有将它们连接在一起的功能吗?还是我误解了这个嘿
【解决方案2】:

解决办法是

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

【讨论】:

    猜你喜欢
    • 2015-02-07
    • 2023-03-20
    • 2016-02-12
    • 2011-02-14
    • 2019-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多