【问题标题】:Primitive Recursive function原始递归函数
【发布时间】:2016-02-12 07:08:40
【问题描述】:

A tutorial on universality and expressiveness of fold 第 4.1 章中,声明了这种递归模式

h y [] = f y
h y (x:xs) = g y x xs (h y xs)

是原始递归,但我不明白为什么模式

h [] = v
h (x:xs) = g x (h xs)

不是根据definition of primitive recursive的原始递归。
如果我们让y = xsy' = x:xsh y' 的值仍然基于h (x:xs) = g x (h xs) 中的h y

【问题讨论】:

  • 第 4.1 章在哪里说您的第二个示例不是原始递归的?它从您的第二个示例开始,然后只是对其进行概括(通过添加额外的y 参数)以获得您的第一个版本。但我没有看到只有你的第一个使用原始递归的说法。
  • @Cactus 这种对列表的递归模式称为原始递归(Kleene,1952)。我想我误解了它的意思。谢谢!
  • 是的,但这意味着您的第一个示例称为原始递归,与 您的第二个示例(此外,引用您的示例会令人困惑,因为与教程相比,您颠倒了它们的顺序......)
  • @Cactus 教程说“我们将把这种递归模式推广到原始递归”。这种暗示原始模式不是原始递归。
  • 另一个问题是为什么这是一个泛化形式?

标签: haskell recursion functional-programming fold


【解决方案1】:

原始递归方案是参数化f,g的选择上

h y [] = f y
h y (x:xs) = g y x xs (h y xs)

即我们可以随意选择f,g,而h会通过原语递归来定义。

具体来说,我们可以选择

f = \y -> v
g = \y x xs -> g' x z

g' 是我们选择的任何其他函数。然后我们得到

h y [] = v
h y (x:xs) = g' x (h y xs)

现在,如果我们让

h' xs = h () xs

我们将y 参数固定为一个无关紧要的值,以便恢复问题中的函数。学究式地,h' 不是直接作为一般形式的实例获得的,因此h' 在技术上不是通过上面看到的原始递归方案定义的(即,它不是一个实例)。有时,我们发现有许多变量 y1 .. yn 而不是 y,在这种情况下,我们可以根据需要选择 n=0 并删除 y

【讨论】:

  • 好吧,您比较一般方案和期望的目标,并尝试实例化参数以使它们匹配。可能需要进行一些试验和错误。
  • 根据primitive recursive definition,我认为一般的方案应该是h y (x:xs) = g y xs (h y xs),但是为什么在A tutorial on the universality and expressiveness of fold中定义为h y (x:xs) = g y x xs (h y xs)
  • @Sid 原始递归的第一个定义仅将自然数视为参数。在处理列表时,它必须被扩展。如果我们按照您的建议扩展它,那么h y (x:xs) 不能依赖于x,这是非常严格的:我们无法访问任何列表元素!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-10
  • 2021-12-17
相关资源
最近更新 更多