I'm studying induction and I've some problems to figure out how to complete an induction proof of my "destutter" function that deletes consecutive duplicates in a list:
destutter [] = [] Destrutter.1
destutter (x:xs) = x : (destutter (dropWhile (== x) xs)) Destrutter.2
And this is the assumption:
destutter (destutter xs) == destutter xs
This is what I've done so far:
Proving the base case (empty list)
-- BASE CASE --
Left side:
destutter (destutter xs)
== {- xs = [] -}
destutter (destutter [])
== {- Destrutter.1, destutter [] = [] -}
destutter ([])
== {- Destrutter.1, destutter [] = [] -}
[]
Right side:
destrutter xs
== {- xs = [] -}
destrutter []
== {- Destrutter.1, destutter [] = [] -}
[]
Left side == Right side -> Proved
Proving the general case:
-- 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))))
Here is where I've some problems: I can't figure out how to use the assumption to get to:
destrutter (x:xs)
I've tried different ways but no one seems to be the correct one. Are the steps I did good? Is my reasoning way correct?