From 91efce41a2319a9fb861ff26d7dc8c49ec726d4c Mon Sep 17 00:00:00 2001 From: Josh Chen Date: Tue, 12 Jun 2018 12:30:54 +0200 Subject: Type rules now have \"all\" premises explicitly stated, matching the formulation in the HoTT book. --- Equal.thy | 154 ++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 79 insertions(+), 75 deletions(-) (limited to 'Equal.thy') diff --git a/Equal.thy b/Equal.thy index b9f676f..12ed272 100644 --- a/Equal.thy +++ b/Equal.thy @@ -1,81 +1,85 @@ +(* Title: HoTT/Equal.thy + Author: Josh Chen + Date: Jun 2018 + +Equality type. +*) + theory Equal - imports HoTT_Base Prod + imports HoTT_Base begin -subsection \Equality type\ - - axiomatization - Equal :: "[Term, Term, Term] \ Term" - - syntax - "_EQUAL" :: "[Term, Term, Term] \ Term" ("(3_ =\<^sub>_/ _)" [101, 101] 100) - "_EQUAL_ASCII" :: "[Term, Term, Term] \ Term" ("(3_ =[_]/ _)" [101, 0, 101] 100) - translations - "a =[A] b" \ "CONST Equal A a b" - "a =\<^sub>A b" \ "CONST Equal A a b" - - axiomatization - refl :: "Term \ Term" ("(refl'(_'))") and - indEqual :: "[Term, [Term, Term, Term] \ Term] \ Term" ("(indEqual[_])") - where - Equal_form: "\A a b::Term. \A : U; a : A; b : A\ \ a =\<^sub>A b : U" - (* Should I write a permuted version \\A : U; b : A; a : A\ \ \\? *) - and - Equal_intro [intro]: "\A x::Term. x : A \ refl(x) : x =\<^sub>A x" - and - Equal_elim [elim]: - "\(A::Term) (C::[Term, Term, Term] \ Term) (f::Term) (a::Term) (b::Term) (p::Term). - \ \x y::Term. \x : A; y : A\ \ C(x)(y): x =\<^sub>A y \ U; - f : \x:A. C(x)(x)(refl(x)); - a : A; - b : A; - p : a =\<^sub>A b \ - \ indEqual[A](C)`f`a`b`p : C(a)(b)(p)" - and - Equal_comp [simp]: - "\(A::Term) (C::[Term, Term, Term] \ Term) (f::Term) (a::Term). indEqual[A](C)`f`a`a`refl(a) \ f`a" - - lemmas Equal_formation [intro] = Equal_form Equal_form[rotated 1] Equal_form[rotated 2] - - subsubsection \Properties of equality\ - - text "Symmetry/Path inverse" - - definition inv :: "[Term, Term, Term] \ Term" ("(1inv[_,/ _,/ _])") - where "inv[A,x,y] \ indEqual[A](\x y _. y =\<^sub>A x)`(\<^bold>\x:A. refl(x))`x`y" - - lemma inv_comp: "\A a::Term. a : A \ inv[A,a,a]`refl(a) \ refl(a)" unfolding inv_def by simp - - text "Transitivity/Path composition" - - \ \"Raw" composition function\ - definition compose' :: "Term \ Term" ("(1compose''[_])") - where "compose'[A] \ indEqual[A](\x y _. \z:A. \q: y =\<^sub>A z. x =\<^sub>A z)`(indEqual[A](\x z _. x =\<^sub>A z)`(\<^bold>\x:A. refl(x)))" - - \ \"Natural" composition function\ - abbreviation compose :: "[Term, Term, Term, Term] \ Term" ("(1compose[_,/ _,/ _,/ _])") - where "compose[A,x,y,z] \ \<^bold>\p:x =\<^sub>A y. \<^bold>\q:y =\<^sub>A z. compose'[A]`x`y`p`z`q" - - (**** GOOD CANDIDATE FOR AUTOMATION ****) - lemma compose_comp: - assumes "a : A" - shows "compose[A,a,a,a]`refl(a)`refl(a) \ refl(a)" using assms Equal_intro[OF assms] unfolding compose'_def by simp - - text "The above proof is a good candidate for proof automation; in particular we would like the system to be able to automatically find the conditions of the \using\ clause in the proof. - This would likely involve something like: - 1. Recognizing that there is a function application that can be simplified. - 2. Noting that the obstruction to applying \Prod_comp\ is the requirement that \refl(a) : a =\<^sub>A a\. - 3. Obtaining such a condition, using the known fact \a : A\ and the introduction rule \Equal_intro\." - - lemmas Equal_simps [simp] = inv_comp compose_comp - - subsubsection \Pretty printing\ - - abbreviation inv_pretty :: "[Term, Term, Term, Term] \ Term" ("(1_\<^sup>-\<^sup>1[_, _, _])" 500) - where "p\<^sup>-\<^sup>1[A,x,y] \ inv[A,x,y]`p" - - abbreviation compose_pretty :: "[Term, Term, Term, Term, Term, Term] \ Term" ("(1_ \[_, _, _, _]/ _)") - where "p \[A,x,y,z] q \ compose[A,x,y,z]`p`q" +axiomatization + Equal :: "[Term, Term, Term] \ Term" and + refl :: "Term \ Term" ("(refl'(_'))" 1000) and + indEqual :: "[Term, [Term, Term, Term] \ Term] \ Term" ("(indEqual[_])") + +syntax + "_EQUAL" :: "[Term, Term, Term] \ Term" ("(3_ =\<^sub>_/ _)" [101, 101] 100) + "_EQUAL_ASCII" :: "[Term, Term, Term] \ Term" ("(3_ =[_]/ _)" [101, 0, 101] 100) +translations + "a =[A] b" \ "CONST Equal A a b" + "a =\<^sub>A b" \ "CONST Equal A a b" + +axiomatization where + Equal_form: "\A a b::Term. \A : U; a : A; b : A\ \ a =\<^sub>A b : U" + (* Should I write a permuted version \\A : U; b : A; a : A\ \ \\? *) +and + Equal_intro [intro]: "\A x::Term. x : A \ refl(x) : x =\<^sub>A x" +and + Equal_elim [elim]: + "\(A::Term) (C::[Term, Term, Term] \ Term) (f::Term) (a::Term) (b::Term) (p::Term). + \ \x y::Term. \x : A; y : A\ \ C(x)(y): x =\<^sub>A y \ U; + f : \x:A. C(x)(x)(refl(x)); + a : A; + b : A; + p : a =\<^sub>A b \ + \ indEqual[A](C)`f`a`b`p : C(a)(b)(p)" +and + Equal_comp [simp]: + "\(A::Term) (C::[Term, Term, Term] \ Term) (f::Term) (a::Term). indEqual[A](C)`f`a`a`refl(a) \ f`a" + +lemmas Equal_formation [intro] = Equal_form Equal_form[rotated 1] Equal_form[rotated 2] + +subsubsection \Properties of equality\ + +text "Symmetry/Path inverse" + +definition inv :: "[Term, Term, Term] \ Term" ("(1inv[_,/ _,/ _])") + where "inv[A,x,y] \ indEqual[A](\x y _. y =\<^sub>A x)`(\<^bold>\x:A. refl(x))`x`y" + +lemma inv_comp: "\A a::Term. a : A \ inv[A,a,a]`refl(a) \ refl(a)" unfolding inv_def by simp + +text "Transitivity/Path composition" + +\ \"Raw" composition function\ +definition compose' :: "Term \ Term" ("(1compose''[_])") + where "compose'[A] \ indEqual[A](\x y _. \z:A. \q: y =\<^sub>A z. x =\<^sub>A z)`(indEqual[A](\x z _. x =\<^sub>A z)`(\<^bold>\x:A. refl(x)))" + +\ \"Natural" composition function\ +abbreviation compose :: "[Term, Term, Term, Term] \ Term" ("(1compose[_,/ _,/ _,/ _])") + where "compose[A,x,y,z] \ \<^bold>\p:x =\<^sub>A y. \<^bold>\q:y =\<^sub>A z. compose'[A]`x`y`p`z`q" + +(**** GOOD CANDIDATE FOR AUTOMATION ****) +lemma compose_comp: + assumes "a : A" + shows "compose[A,a,a,a]`refl(a)`refl(a) \ refl(a)" using assms Equal_intro[OF assms] unfolding compose'_def by simp + +text "The above proof is a good candidate for proof automation; in particular we would like the system to be able to automatically find the conditions of the \using\ clause in the proof. +This would likely involve something like: + 1. Recognizing that there is a function application that can be simplified. + 2. Noting that the obstruction to applying \Prod_comp\ is the requirement that \refl(a) : a =\<^sub>A a\. + 3. Obtaining such a condition, using the known fact \a : A\ and the introduction rule \Equal_intro\." + +lemmas Equal_simps [simp] = inv_comp compose_comp + +subsubsection \Pretty printing\ + +abbreviation inv_pretty :: "[Term, Term, Term, Term] \ Term" ("(1_\<^sup>-\<^sup>1[_, _, _])" 500) + where "p\<^sup>-\<^sup>1[A,x,y] \ inv[A,x,y]`p" + +abbreviation compose_pretty :: "[Term, Term, Term, Term, Term, Term] \ Term" ("(1_ \[_, _, _, _]/ _)") + where "p \[A,x,y,z] q \ compose[A,x,y,z]`p`q" end \ No newline at end of file -- cgit v1.2.3