(* Title: HoTT/ProdProps.thy Author: Josh Chen Date: Aug 2018 Properties of the dependent product. *) theory ProdProps imports HoTT_Methods Prod begin section \Composition\ text " The proof of associativity needs some guidance; it involves telling Isabelle to use the correct rule for \-type definitional equality, and the correct substitutions in the subgoals thereafter. " lemma compose_assoc: assumes "A: U(i)" and "f: A \ B" "g: B \ C" "h: \x:C. D(x)" shows "(h \ g) \ f \ h \ (g \ f)" proof (subst (0 1 2 3) compose_def) show "\<^bold>\x. (\<^bold>\y. h`(g`y))`(f`x) \ \<^bold>\x. h`((\<^bold>\y. g`(f`y))`x)" proof (subst Prod_eq) \ \Todo: set the Simplifier (or other simplification methods) up to use \Prod_eq\!\ show "\x. x: A \ (\<^bold>\y. h`(g`y))`(f`x) \ h`((\<^bold>\y. g`(f`y))`x)" proof compute show "\x. x: A \ h`(g`(f`x)) \ h`((\<^bold>\y. g`(f`y))`x)" proof compute show "\x. x: A \ g`(f`x): C" by (simple lems: assms) qed show "\x. x: B \ h`(g`x): D(g`x)" by (simple lems: assms) qed (simple lems: assms) qed fact qed lemma compose_comp': assumes "A: U(i)" and "\x. x: A \ b(x): B" and "\x. x: B \ c(x): C(x)" shows "(\<^bold>\x. c(x)) \ (\<^bold>\x. b(x)) \ \<^bold>\x. c(b(x))" proof (subst compose_def, subst Prod_eq) show "\x. x: A \ (\<^bold>\x. c(x))`((\<^bold>\x. b(x))`x) \ \<^bold>\x. c (b x)" proof compute text "However we can derive a variant with more explicit premises:" lemma compose_comp: assumes "A: U(i)" "B: U(i)" "C: B \ U(i)" and "\x. x: A \ b(x): B" and "\x. x: B \ c(x): C(x)" shows "(\<^bold>\x. c(x)) \ (\<^bold>\x. b(x)) \ \<^bold>\x. c(b(x))" proof (subst compose_def) show "\<^bold>\x. (\<^bold>\x. c(x))`((\<^bold>\x. b(x))`x) \ \<^bold>\x. c(b(x))" proof show "\a. a: A \ (\<^bold>\x. c(x))`((\<^bold>\x. b(x))`a) \ c(b(a))" proof compute show "\a. a: A \ c((\<^bold>\x. b(x))`a) \ c(b(a))" by compute (simple lems: assms) qed (simple lems: assms) qed fact qed (simple lems: assms) lemmas compose_comps [comp] = compose_def compose_comp end