I am stuck trying to prove something in Coq that involves the use of a type class.
The specific type class is almost identical to this Functor type class: https://gist.github.com/aztek/2911378
My instance looks like this:
Instance ListFunctor : Functor list := { fmap := map }.
(* Proof stuff here *)
Defined.
map is the map over lists from the standard library.
The "proof" I am doing is basically just a unit test:
Example list_map_test : fmap (fun x => x + 1) (1::2::3::nil) = (2::3::4::nil).
My goal looks like this and I am stuck:
(let (fmap0, _, _) := ListFunctor in fmap0) nat nat
(fun x : nat => x + 1) (1 :: 2 :: 3 :: nil) = 2 :: 3 :: 4 :: nil
Coq destructured the instance to get fmap0 and then applied the resulting anonymous function with the args nat nat (fun x : nat => x + 1) (1 :: 2 :: 3 :: nil).
As the next step in my proof, I would like to unfold fmap0 or the anonymous function.
How can I do this? I cannot do unfold fmap0.
My expectation was that fmap0 is the standard lib map because that is what I gave to the instance.
I was able to destruct the instance myself, but this shows the abstract version of fmap0 and not the implementation that was given when instantiating the type class.
What am I doing wrong?