aboutsummaryrefslogtreecommitdiff
path: root/HoTT.thy
blob: 682319d6d040034e67b7e3022bf41d8ac27eb02a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
theory HoTT
imports Pure
begin

section ‹Setup›
text 
For ML files, routines and setup.


section ‹Basic definitions›
text 
A single meta-level type ‹Term› suffices to implement the object-level types and terms.
For now we do not implement universes, but simply follow the informal notation in the HoTT book.
 (* Actually unsure if a single meta-type suffices... *)

typedecl Term

subsection ‹Judgements›
consts
  is_a_type :: "Term ⇒ prop"           ("(_ : U)" [0] 1000)
  is_of_type :: "Term ⇒ Term ⇒ prop"  ("(3_ :/ _)" [0, 0] 1000)

subsection ‹Basic axioms›
subsubsection ‹Definitional equality›
text
We take the meta-equality ≡, defined by the Pure framework for any of its terms,
and use it additionally for definitional/judgmental equality of types and terms in our theory.

Note that the Pure framework already provides axioms and results for the various properties of ≡,
which we make use of and extend where necessary.


subsubsection ‹Type-related properties›

axiomatization where
  term_substitution: "⋀(A::Term) (x::Term) y::Term. x ≡ y ⟹ A(x) ≡ A(y)" and
  equal_types: "⋀(A::Term) (B::Term) x::Term. ⟦A ≡ B; x : A⟧ ⟹ x : B" and
  inhabited_implies_type: "⋀(x::Term) A::Term. x : A ⟹ A : U"

subsection ‹Basic types›

subsubsection ‹Nondependent function type›
(*
Write this for now to test stuff, later I should make
this an instance of the dependent function. 
Same for the nondependent product below.

Note that the syntax ❙λ (bold lambda) clashes with the proof term syntax!
(See §2.5.2, The Isabelle/Isar Implementation.)
*)

axiomatization
  Function :: "Term ⇒ Term ⇒ Term"  (infixr "→" 10) and
  lambda :: "Term ⇒ Term ⇒ Term ⇒ Term"  ("(3❙λ_:_./ _)" [1000, 0, 0] 10) and
  appl :: "Term ⇒ Term ⇒ Term"      ("(3_`/_)" [10, 10] 10)
where
  Function_form: "⋀(A::Term) B::Term. ⟦A : U; B : U⟧ ⟹ A→B : U" and
  Function_intro: "⋀(A::Term) (B::Term) b::Term. (⋀x. x : A ⟹ b(x) : B) ⟹ ❙λx:A. b(x) : A→B" and
  Function_elim: "⋀A B f a. ⟦f : A→B; a : A⟧ ⟹ f`a : B"
  (* beta and eta reductions should go here *)

subsubsection ‹Nondependent product type›

axiomatization
  Product :: "Term ⇒ Term ⇒ Term"  ("(_×/ _)") and
  pair :: "Term ⇒ Term ⇒ Term"     ("(_,/ _)") and
  rec_Product :: "Term ⇒ Term ⇒ Term ⇒ Term ⇒ Term"  ("(rec'_Product'(_,_,_,_'))")
where
  Product_form: "⋀A B. ⟦A : U; B : U⟧ ⟹ A×B : U" and
  Product_intro: "⋀A B a b. ⟦a : A; b : B⟧ ⟹ (a,b) : A×B" and
  Product_elim: "⋀A B C g. ⟦A : U; B : U; C : U; g : A→B→C⟧ ⟹ rec_Product(A,B,C,g) : (A×B)→C" and
  Product_comp: "⋀A B C g a b. ⟦C : U; g : A→B→C; a : A; b : B⟧ ⟹ rec_Product(A,B,C,g)`(a,b) ≡ (g`a)`b"

 ‹Projection onto first component›
definition proj1 :: "Term ⇒ Term ⇒ Term" ("(proj1⟨_,_⟩)") where
  "proj1⟨A,B⟩ ≡ rec_Product(A, B, A, ❙λx. ❙λy. x)"

subsubsection ‹Empty type›

axiomatization
  Null :: Term and
  ind_Null :: "Term ⇒ Term ⇒ Term" ("(ind'_Null'(_,/ _'))")
where
  Null_form: "Null : U" and
  Null_elim: "⋀C x a. ⟦x : Null ⟹ C(x) : U; a : Null⟧ ⟹ ind_Null(C(x), a) : C(a)"

subsubsection ‹Natural numbers›

axiomatization
  Nat :: Term and
  zero :: Term ("0") and
  succ :: "Term ⇒ Term" and  (* how to enforce ‹succ : Nat→Nat›? *)
  ind_Nat :: "Term ⇒ Term ⇒ Term ⇒ Term ⇒ Term"
where
  Nat_form: "Nat : U" and
  Nat_intro1: "0 : Nat" and
  Nat_intro2: "⋀n. n : Nat ⟹ succ n : Nat"
  (* computation rules *)

subsubsection ‹Equality type›

axiomatization
  Equal :: "Term ⇒ Term ⇒ Term ⇒ Term"  ("(_ =_ _)") and
  refl :: "Term ⇒ Term"                   ("(refl'(_'))")
where
  Equal_form: "⋀A a b. ⟦a : A; b : A⟧ ⟹ a =A b : U" and
  Equal_intro: "⋀A x. x : A ⟹ refl x : x =A x"

end