proposition: Theorem add_mul_add_iso : forall a b c, (a + b) * (a + c) ≅ (a * a) + (a * c) + (b * a) + (b * c).
proof: Proof. intros. exists (fun p => match p with | (inl x, inl y) => inl (inl (inl (x, y))) | (inl x, inr y) => inl (inl (inr (x, y))) | (inr x, inl y) => inl (inr (x, y)) | (inr x, inr y) => inr (x, y) end). exists (fun p => match p with | inl (inl (inl (x, y))) => (inl x, inl y) | inl (inl (inr (x, y))) => (inl x, inr y) | inl (inr (x, y)) => (inr x, inl y) | inr (x, y) => (inr x, inr y) end). extensionalize. Qed.
imports: Hask.Ltac Hask.Prelude Hask.Control.Applicative Hask.Control.Monad Hask.Control.Monad.Cont Hask.Control.Monad.State Hask.Data.Functor.Contravariant Hask.Data.Functor.Identity Hask.Data.Functor.Kan Hask.Data.Functor.Yoneda Hask.Control.Lens Coq.Classes.Morphisms Coq.Setoids.Setoid Coq.Init.Datatypes Coq.Relations.Relation_Definitions FunctionalExtensionality