【问题标题】:Structural induction in HaskellHaskell 中的结构归纳
【发布时间】:2025-12-08 20:10:01
【问题描述】:

以下是结构归纳的定义吗?

foldr f a (xs::ys) = foldr f (foldr f a ys) xs

谁能给我一个 Haskell 结构归纳的例子?

【问题讨论】:

    标签: haskell induction


    【解决方案1】:

    您没有指定它,但我假设:: 表示列表连接和 使用 ++,因为那是 Haskell 中使用的运算符。 为了证明这一点,我们将对xs 进行归纳。首先,我们证明了 声明适用于基本情况(即xs = []

    foldr f a (xs ++ ys) 
    {- By definition of xs -}
    = foldr f a ([] ++ ys)
    {- By definition of ++ -}
    = foldr f a ys
    

    foldr f (foldr f a ys) xs
    {- By definition of xs -}
    = foldr f (foldr f a ys) []
    {- By definition of foldr -}
    = foldr f a ys
    

    现在,我们假设归纳假设 foldr f a (xs ++ ys) = foldr f (foldr f a ys) xs 适用于 xs 并表明它将适用于列表 x:xs 也是。

    foldr f a (x:xs ++ ys)
    {- By definition of ++ -}
    = foldr f a (x:(xs ++ ys))
    {- By definition of foldr -}
    = x `f` foldr f a (xs ++ ys)
             ^------------------ call this k1
    = x `f` k1
    

    foldr f (foldr f a ys) (x:xs)
    {- By definition of foldr -}
    = x `f` foldr f (foldr f a ys) xs
             ^----------------------- call this k2
    = x `f` k2
    

    现在,根据我们的归纳假设,我们知道k1k2 是相等的, 因此

    x `f` k1 =  x `f` k2
    

    从而证明我们的假设。

    【讨论】: