(******** Isabelle/HoTT: Dependent product (dependent function) Jan 2019 ********) theory Prod imports HoTT_Base HoTT_Methods begin section \Basic type definitions\ axiomatization Prod :: "[t, t \ t] \ t" and lam :: "[t, t \ t] \ t" and app :: "[t, t] \ t" ("(1_ ` _)" [120, 121] 120) \ \Application should bind tighter than abstraction.\ syntax "_Prod" :: "[idt, t, t] \ t" ("(3TT '(_: _')./ _)" 30) "_Prod'" :: "[idt, t, t] \ t" ("(3TT _: _./ _)" 30) "_lam" :: "[idt, t, t] \ t" ("(3,\\ '(_: _')./ _)" 30) "_lam'" :: "[idt, t, t] \ t" ("(3,\\ _: _./ _)" 30) translations "TT(x: A). B" \ "(CONST Prod) A (\x. B)" "TT x: A. B" \ "(CONST Prod) A (\x. B)" ",\\(x: A). b" \ "(CONST lam) A (\x. b)" ",\\x: A. b" \ "(CONST lam) A (\x. b)" text \ The syntax translations above bind the variable @{term x} in the expressions @{term B} and @{term b}. \ text \Non-dependent functions are a special case:\ abbreviation Fun :: "[t, t] \ t" (infixr "\" 40) where "A \ B \ TT(_: A). B" axiomatization where \ \Type rules\ Prod_form: "\A: U i; \x. x: A \ B x: U i\ \ TT x: A. B x: U i" and Prod_intro: "\A: U i; \x. x: A \ b x: B x\ \ ,\\x: A. b x: TT x: A. B x" and Prod_elim: "\f: TT x: A. B x; a: A\ \ f`a: B a" and Prod_cmp: "\\x. x: A \ b x: B x; a: A\ \ (,\\x: A. b x)`a \ b a" and Prod_uniq: "f: TT x: A. B x \ ,\\x: A. f`x \ f" and \ \Congruence rules\ Prod_form_eq: "\A: U i; B: A \ U i; C: A \ U i; \x. x: A \ B x \ C x\ \ TT x: A. B x \ TT x: A. C x" and Prod_intro_eq: "\\x. x: A \ b x \ c x; A: U i\ \ ,\\x: A. b x \ ,\\x: A. c x" text \ The Pure rules for \\\ only let us judge strict syntactic equality of object lambda expressions. The actual definitional equality rule in the type theory is @{thm Prod_intro_eq}. Note that this is a separate rule from function extensionality. \ lemmas Prod_form [form] lemmas Prod_routine [intro] = Prod_form Prod_intro Prod_elim lemmas Prod_comp [comp] = Prod_cmp Prod_uniq section \Additional definitions\ definition compose :: "[t, t, t] \ t" where "compose A g f \ ,\\x: A. g`(f`x)" declare compose_def [comp] syntax "_compose" :: "[t, t] \ t" (infixr "o" 110) parse_translation \ let fun compose_tr ctxt tms = let val f::g::_ = tms; fun domain f = @{term "A :: t"} in @{const compose} $ (domain f) $ f $ g end in [("_compose", compose_tr)] end \ ML_val \ Proof_Context.get_thms @{context} "compose_def" \ lemma compose_assoc: assumes "A: U i" "f: A \ B" "g: B \ C" "h: TT x: C. D x" shows "(h o g) o f \ h o (g o f)" ML_prf \ @{thms assms}; \ (* (derive lems: assms Prod_intro_eq) *) 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)" by (derive lems: assms Prod_intro_eq) abbreviation id :: "t \ t" where "id A \ ,\\x: A. x" end