叶子的数量比Haskell中的节点数量大一个

时间:2018-02-12 18:18:07

标签: haskell

我必须证明给定一个二叉树,叶子的数量等于在Haskell中使用归纳的节点数量加上一个。 给定以下类型的树:

data Tree = Leaf Int | Node Tree Tree 

我定义了两个名为leaves和nodes的函数,它们分别返回叶子和节点的数量:

通过归纳,我知道我需要证明基本情况,即当节点数为0时,对于归纳步​​骤,我需要使用归纳假设。但这让我失望的是,有两个功能,我真的不知道要继续。在基本情况下,我应该表明,如果节点数为0,叶数是1还是? / p>

1 个答案:

答案 0 :(得分:4)

通过归纳法实现这一目标"没有使用induction on natural numbers,而是使用structural induction。证据就像这样打破了:

基本案例

基本情况适用于Leaf x,其中xInt。所以你必须证明任何x

leaves (Leaf x) = 1 + nodes (Leaf x)

归纳步骤

在归纳步骤中,您假设两个归纳假设:

  1. leaves t = 1 + nodes t
  2. leaves u = 1 + nodes u
  3. 证明

    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给出了一个与有充分根据的归纳更紧密联系的建设性版本。