Haskell自定义函数的归纳证明

Haskell自定义函数的归纳证明,haskell,induction,Haskell,Induction,我正在学习归纳法,我有一些问题想弄清楚如何完成我的“destutter”函数的归纳法证明,该函数删除列表中的连续重复项: destutter [] = [] Destrutter.1 destutter (x:xs) = x : (destutter (dropWhile (== x) xs)) Destrutter.2 这是一个假设: destutter (destutter xs) == destutte

我正在学习归纳法,我有一些问题想弄清楚如何完成我的“destutter”函数的归纳法证明,该函数删除列表中的连续重复项:

destutter [] = []                                          Destrutter.1
destutter (x:xs) = x : (destutter (dropWhile (== x) xs))   Destrutter.2
这是一个假设:

destutter (destutter xs) == destutter xs
这就是我到目前为止所做的:

证明基本情况(空列表)

证明一般情况:

-- GENERAL CASE --

Assumption: destutter (destutter xs) == destutter xs
Claim: destutter (destutter (x:xs)) == destutter (x:xs)

destutter (destutter (x:xs))
== {- Destrutter.2, destutter (x:xs) = x : (destutter (dropWhile (== x) xs)) -}
destutter (x: (destutter (dropWhile (== x) xs)))
== {- Destrutter.2, destutter (x:xs) = x : (destutter (dropWhile (== x) xs)) -}
x : (destrutter (dropWhile (==x) (destutter (dropWhile (== x) xs))))
以下是我遇到的一些问题:我不知道如何使用假设来实现:

destrutter (x:xs)
我尝试过不同的方法,但似乎没有一种是正确的。
我做得好吗?我的推理方法正确吗

作为旁注:
destutter=map head。小组
。也许你应该试着证明
头。破坏。(dropWhile(=x))/=x
首先您需要去掉外部的
dropWhile
-注意,它永远不会更改列表,以证明您需要显示列表的第一个元素
destutter(dropWhile(=x)xs))
永远不等于
x
,因此
dropWhile(=x)
将立即返回。完成此操作后,可以使用
destrutter(destrutter(dropWhile(=x)xs))
上的归纳假设来获得
destrutter(dropWhile(=x)xs)
。严格地说,要做到这一点,您需要证明列表
dropWhile(=x)xs
比列表
x:xs
小-这是“显而易见的”,但可能无论如何都需要证明。@user2407038首先,感谢您的支持。我如何证明
destutter(dropWhile(=x)xs))
永远不等于x(这是真的,当然是错的)?这是我的主要问题。。。
destrutter (x:xs)