Proving Length Preservation by List Map Example
Assume the following type 'a list
is inductive. Prove that length (map f l) = length l
for all lists l : 'a list
and all total functions f : 'a -> 'b
.
ocaml
type 'a list =
| []
| (::) of 'a * 'a list
let rec length : 'a list -> int =
function
| [] -> 0
| _x :: xs -> 1 + length xs
let rec map : ('a -> 'b) -> 'a list -> 'b list =
fun f l ->
match l with
| [] -> []
| x :: xs ->
let y = f x in
let ys = map f xs in
y :: ys
Solution
Let l : 'a list
and f : 'a -> 'b
be total.
We proceed by structural induction on the list l
.
Case
l = []
:By definition of
map
:ocamllength (map f []) = length []
Case
l = x :: xs
:Our induction hypothesis is that
length (map f xs) = length xs
.By definition of
map
andlength
, as well as the induction hypothesis:ocamllength (map f (x :: xs)) = length (f x :: map f xs) = 1 + length (map f xs) = 1 + length xs
Likewise:
ocamllength (x :: xs) = 1 + length xs
Therefore, length (map f l) = length l
holds for all lists l : 'a list
and all total functions f : 'a -> 'b
.