【问题标题】:Structural Induction and Induction Hypothesis in HaskellHaskell 中的结构归纳和归纳假设
【发布时间】:2015-01-20 14:05:38
【问题描述】:

我正在尝试使用结构归纳来证明 'ns'。所有列表 'ns' 的类型均为 [Int],所有 'm' 的类型均为 Int

foldl (+) m ns = m + (sum ns)

定义:

sum :: [Int] -> Int         -- summation of an Int list
sum []     = 0              -- s.1
sum (x:xs) = x + (sum xs)   -- s.2

foldl :: (a -> b -> a) -> a -> [b] -> a    -- fold left
foldl _ s []     = s                       -- fl.1
foldl f s (x:xs) = foldl f (f s x) xs      -- fl.2

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

【问题讨论】:

  • 你自己有什么想法吗?你尝试过什么吗?当然,您已经获得了一些关于这种证明的一般情况的示例。
  • 您的代码似乎不一致地使用了my_ 前缀。我猜你应该编辑你的问题以删除它们。

标签: haskell induction


【解决方案1】:

我们想证明对于所有nsmfoldl (+) m ns = m + sum ns。我们将在ns 上进行归纳。换句话说,我们证明该属性适用于空列表,并且适用于n:ns,只要它适用于ns

首先,让我们看看空列表,让m 是一个任意数字。我们的目标是证明foldl (+) m [] = m + sum []。有很多方法可以做到这一点,但我们将通过等式推理将等式的左侧转换为右侧。

foldl (+) m []  -- by definition of foldl
m               -- by right identity of addition
m + 0           -- by the definition of sum
m + sum []      -- QED

现在是(:) 案例。让我们的列表为n:ns。假设对于任何m,该属性对于ns 成立(这是归纳假设)。我们的目标是证明foldl (+) m (n:ns) = m + sum (n:ns)。同样,我们使用等式推理。

foldl (+) m (n:ns)    -- by the definition of foldl
foldl (+) (m + n) ns  -- by the induction hypothesis, applied to (m + n)
(m + n) + sum ns      -- by associativity of addition
m + (n + sum ns)      -- by the definition of sum
m + sum (n:ns)        -- QED

我们完成了。


新的证明写作学生的一个常见问题是,他们不确定自己所做的事情是否真的有意义,这让他们感到紧张。我建议看一下证明助手,例如 AgdaCoq。它们非常适合建立证明写作技巧。作为 Agda 的一个小例子,上面的证明可以在那里写得非常相似,但有一些语法差异:

-- imports omitted

prop : forall m ns → foldl (_+_) m ns ≡ m + sum ns

prop m [] = begin
  foldl (_+_) m []     ≡⟨⟩ 
  m                    ≡⟨ sym $ +-right-identity m ⟩
  m + 0                ≡⟨⟩
  m + sum []           ∎

prop m (x ∷ ns) = begin 
  foldl _+_ m (x ∷ ns)     ≡⟨⟩
  foldl _+_ (m + x) ns     ≡⟨ prop (m + x) ns ⟩  
  (m + x) + sum ns         ≡⟨ +-assoc m x (sum ns) ⟩ 
  m + (x + sum ns)         ≡⟨⟩
  m + sum (x ∷ ns)         ∎

【讨论】:

  • 在证明时将语句foldl (+) ns = m + sum ns 分成 LHS(左手语句)和 RHS(右手语句)更好,还是像您所做的那样将语句全部一起证明更好?
  • 你这是什么意思?我们可以将左侧转换为右侧,或将右侧转换为左侧,或将两侧转换为第三个表达式;目标是表明双方是平等的。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2013-02-04
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
相关资源
最近更新 更多