(* Title: HoTT/HoTT_Methods.thy Author: Josh Chen Date: Jun 2018 Method setup for the HoTT library. Relies on Eisbach, which for the moment lives in HOL/Eisbach. *) theory HoTT_Methods imports "HOL-Eisbach.Eisbach" "HOL-Eisbach.Eisbach_Tools" HoTT_Base Equal Prod Sum begin text "This method finds a proof of any valid typing judgment derivable from a given wellformed judgment." method wellformed uses jdgmt = ( match jdgmt in "?a : ?A" \ \ rule HoTT_Base.inhabited_implies_type[OF jdgmt] | wellformed jdgmt: HoTT_Base.inhabited_implies_type[OF jdgmt] \ \ "A : U" for A \ \ match (A) in "\x:?A. ?B x" \ \ print_term "\", (rule Prod.Prod_form_cond1[OF jdgmt] | rule Prod.Prod_form_cond2[OF jdgmt] | catch \wellformed jdgmt: Prod.Prod_form_cond1[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Prod.Prod_form_cond2[OF jdgmt]\ \fail\) \ \ "\x:?A. ?B x" \ \ rule Sum.Sum_form_cond1[OF jdgmt] | rule Sum.Sum_form_cond2[OF jdgmt] | catch \wellformed jdgmt: Sum.Sum_form_cond1[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Sum.Sum_form_cond2[OF jdgmt]\ \fail\ \ \ "?a =[?A] ?b" \ \ rule Equal.Equal_form_cond1[OF jdgmt] | rule Equal.Equal_form_cond2[OF jdgmt] | rule Equal.Equal_form_cond3[OF jdgmt] | catch \wellformed jdgmt: Equal.Equal_form_cond1[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Equal.Equal_form_cond2[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Equal.Equal_form_cond3[OF jdgmt]\ \fail\ \ \ \ "PROP ?P \ PROP Q" for Q \ \ catch \rule Prod.Prod_form_cond1[OF jdgmt]\ \fail\ | catch \rule Prod.Prod_form_cond2[OF jdgmt]\ \fail\ | catch \rule Sum.Sum_form_cond1[OF jdgmt]\ \fail\ | catch \rule Sum.Sum_form_cond2[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Prod.Prod_form_cond1[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Prod.Prod_form_cond2[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Sum.Sum_form_cond1[OF jdgmt]\ \fail\ | catch \wellformed jdgmt: Sum.Sum_form_cond2[OF jdgmt]\ \fail\ \ ) notepad \ \Examples using \wellformed\\ begin assume 0: "f : \x:A. B x" have "\x:A. B x : U" by (wellformed jdgmt: 0) have "A : U" by (wellformed jdgmt: 0) have "B: A \ U" by (wellformed jdgmt: 0) assume 1: "f : \x:A. \y: B x. C x y" have "A : U" by (wellformed jdgmt: 1) have "B: A \ U" by (wellformed jdgmt: 1) have "\x. x : A \ C x: B x \ U" by (wellformed jdgmt: 1) assume 2: "g : \x:A. \y: B x. \z: C x y. D x y z" have a: "A : U" by (wellformed jdgmt: 2) have b: "B: A \ U" by (wellformed jdgmt: 2) have c: "\x. x : A \ C x : B x \ U" by (wellformed jdgmt: 2) have d: "\x y. \x : A; y : B x\ \ D x y : C x y \ U" by (wellformed jdgmt: 2) end end