(******** Isabelle/HoTT: Foundational definitions and notation Jan 2019 This file is the starting point of the Isabelle/HoTT object logic, and contains the basic setup and definitions. Among other things, it defines: * Containers for storing type information of object-level terms. * The universe hierarchy and its governing rules. * Named theorems for later use by proof methods. ********) theory HoTT_Base imports Pure begin section \Terms and typing\ typedecl t \ \Type of object-logic terms (which includes the types)\ consts has_type :: "[t, t] \ prop" \ \The judgment coercion\ text \ We create a dedicated container in which to store object-level typing information whenever a typing judgment that does not depend on assumptions is proved. \ ML \ signature TYPINGS = sig val get: term -> term end structure Typings: TYPINGS = struct structure Typing_Data = Theory_Data ( type T = term Symtab.table val empty = Symtab.empty val extend = I fun merge (tbl, tbl') = let val key_vals = map (Symtab.lookup_key tbl') (Symtab.keys tbl') val updates = map (fn SOME kv => Symtab.update kv) key_vals fun f u t = u t in fold f updates tbl end ) fun get tm = case Symtab.lookup (Typing_Data.get @{theory}) (Syntax.string_of_term @{context} tm) of SOME tm' => tm' | NONE => raise Fail "No typing information available" end \ syntax "_has_type" :: "[t, t] \ prop" ("3(_:/ _)") parse_translation \ \ section \Universes\ typedecl ord \ \Type of meta-numerals\ axiomatization O :: ord and Suc :: "ord \ ord" and lt :: "[ord, ord] \ prop" (infix "<" 999) and leq :: "[ord, ord] \ prop" (infix "\" 999) where lt_Suc: "n < (Suc n)" and lt_trans: "\m1 < m2; m2 < m3\ \ m1 < m3" and leq_min: "O \ n" declare lt_Suc [intro!] leq_min [intro!] lt_trans [intro] axiomatization U :: "ord \ t" where U_hierarchy: "i < j \ U i: U j" and U_cumulative: "\A: U i; i < j\ \ A: U j" and U_cumulative': "\A: U i; i \ j\ \ A: U j" text \ Using method @{method rule} with @{thm U_cumulative} is unsafe, if applied blindly it will very easily lead to non-termination. Instead use @{method elim}, or instantiate @{thm U_cumulative} suitably. @{thm U_cumulative'} is an alternative rule used by the method @{theory_text cumulativity} in @{file HoTT_Methods.thy}. \ section \Type families\ abbreviation (input) constraint :: "[t \ t, t, t] \ prop" ("(1_:/ _ \ _)") where "f: A \ B \ (\x. x: A \ f x: B)" text \We use the notation @{prop "B: A \ U i"} to abbreviate type families.\ section \Named theorems\ named_theorems comp named_theorems form text \ The named theorems above will be used by proof methods defined in @{file HoTT_Methods.thy}. @{attribute comp} declares computation rules, which are used by the \compute\ method, and may also be passed to invocations of the method \subst\ to perform equational rewriting. @{attribute form} declares type formation rules. These are mainly used by the \cumulativity\ method, which lifts types into higher universes. \ (* Todo: Set up the Simplifier! *) end