2

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?

Fossa
  • 159
  • 1
  • 6
  • As a side note: `destutter = map head . group`. – effectfully Nov 13 '15 at 11:18
  • maybe you should try to *proof* that `head . destutter . (dropWhile (== x)) /= x` first – Random Dev Nov 13 '15 at 11:38
  • You need to get rid of the outer `dropWhile` - note, it will never change the list, to prove that you need to show that the first element of the list `destutter (dropWhile (== x) xs))` is never equal to `x`, therefore the `dropWhile (==x)` will return immediately. Once you have done that, you can use the inductive hypothesis on `destrutter (destutter (dropWhile (== x) xs))` to get `destutter (dropWhile (== x) xs)`. Strictly speaking, to do this, you need to prove that the list `dropWhile (==x) xs` is smaller than the list `x:xs` - this is "obvious" but probably needs to be proved anyways. – user2407038 Nov 13 '15 at 20:36
  • @user2407038 First of all, thank you for the support. How can I prove that `destutter (dropWhile (== x) xs))` is never equal to x (that is true, off course)? This is my main problem... – Fossa Nov 16 '15 at 09:29

0 Answers0