我必须证明给定一个二叉树,叶子的数量等于在Haskell中使用归纳的节点数量加上一个。 给定以下类型的树:
data Tree = Leaf Int | Node Tree Tree
我定义了两个名为leaves和nodes的函数,它们分别返回叶子和节点的数量:
通过归纳,我知道我需要证明基本情况,即当节点数为0时,对于归纳步骤,我需要使用归纳假设。但这让我失望的是,有两个功能,我真的不知道要继续。在基本情况下,我应该表明,如果节点数为0,叶数是1还是? / p>
答案 0 :(得分:4)
通过归纳法实现这一目标"没有使用induction on natural numbers,而是使用structural induction。证据就像这样打破了:
基本情况适用于Leaf x
,其中x
是Int
。所以你必须证明任何x
leaves (Leaf x) = 1 + nodes (Leaf x)
在归纳步骤中,您假设两个归纳假设:
leaves t = 1 + nodes t
leaves u = 1 + nodes u
证明
leaves (Node t u) = 1 + nodes (Node t u)
我会让你填写实际的证据。
结构归纳是对自然数的归纳的推广。特别是,您可以将自然数定义为
data Nat = Z | S Nat
现在,您可以使用p Z
的基本案例进行归纳,并采用假定p n
并证明p (S n)
的归纳步骤。
结构归纳本身可以进一步推广到well-founded induction,这是我所知道的归纳的最一般的数学概念。请注意,维基百科页面基于经典的基础概念; nLab给出了一个与有充分根据的归纳更紧密联系的建设性版本。