Skip to content

Commit e64b201

Browse files
Try out Homotopy Type Theory
1 parent 6d11a98 commit e64b201

8 files changed

+638
-2
lines changed

Katydid.lean

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
-- import Katydid.Conal.Language
88
-- import Katydid.Conal.LanguageNotation
9-
-- import Katydid.Conal.RegexNotation
109
-- import Katydid.Conal.Calculus
10+
-- import Katydid.Conal.RegexNotation
1111
-- import Katydid.Conal.Examples
1212
import Katydid.Conal.LanguageHott
1313
import Katydid.Conal.LanguageNotationHott

Katydid/Conal/Calculus.lean

+17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,23 @@ import Katydid.Std.TDecidable
77
open Lang
88
open TDecidable
99

10+
-- Print Parse
11+
set_option pp.all true
12+
open List
13+
def a_or_b := ({'a'} ⋃ {'b'})
14+
#print a_or_b
15+
def a_or_b_parse_a := a_or_b ['a']
16+
-- #eval a_or_b_parse_a
17+
18+
def p : a_or_b ['a'] -> Nat := by
19+
intro x
20+
cases x with
21+
| inl xa =>
22+
cases xa with
23+
| refl => exact 0
24+
| inr xb =>
25+
contradiction
26+
1027
-- ν⇃ : Lang → Set ℓ -- “nullable”
1128
-- ν⇃ P = P []
1229
def ν (P : Lang α) : Type u := -- backslash nu

Katydid/Conal/CalculusHott.lean

+28
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,34 @@ import GroundZero.Types.Equiv
77
open Lang
88
open Id
99

10+
-- Print Parse
11+
set_option pp.all true
12+
open List
13+
def a_or_b := ({'a'} ⋃ {'b'})
14+
#print a_or_b
15+
def a_or_b_parse_a := a_or_b ['a']
16+
-- #eval a_or_b_parse_a
17+
18+
def p : a_or_b ['a'] -> Nat := by
19+
intro x
20+
cases x with
21+
| inl xa =>
22+
cases xa with
23+
| idp => exact 0
24+
| inr xb =>
25+
contradiction
26+
27+
-- fails large elimination
28+
-- hott def hp : a_or_b ['a'] -> Bool :=
29+
-- fun _ => true
30+
-- intro x
31+
-- exact 0
32+
-- cases x with
33+
-- | inl xa =>
34+
-- exact 0
35+
-- | inr xb =>
36+
-- exact 0
37+
1038
-- ν⇃ : Lang → Set ℓ -- “nullable”
1139
-- ν⇃ P = P []
1240
def ν (P : Lang α) : Type u := -- backslash nu

Katydid/Conal/CalculusProp.lean

+328
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,328 @@
1+
-- A translation to Lean from Agda
2+
-- https://github.com/conal/paper-2021-language-derivatives/blob/main/Calculus.lagda
3+
4+
import Katydid.Conal.LanguageNotationProp
5+
open Lang
6+
7+
-- Print Parse
8+
set_option pp.all true
9+
open List
10+
def a_or_b := ({'a'} ⋃ {'b'})
11+
#print a_or_b
12+
def a_or_b_parse_a := a_or_b ['a']
13+
-- #eval a_or_b_parse_a
14+
15+
def p : a_or_b ['a'] -> Nat := by
16+
intro x
17+
cases x with
18+
| inl xa =>
19+
cases xa with
20+
| refl => exact 0
21+
| inr xb =>
22+
contradiction
23+
24+
-- ν⇃ : Lang → Set ℓ -- “nullable”
25+
-- ν⇃ P = P []
26+
def ν (P : Lang α) : Type u := -- backslash nu
27+
P []
28+
29+
-- δ⇃ : Lang → A → Lang -- “derivative”
30+
-- δ⇃ P a w = P (a ∷ w)
31+
def δ (P : Lang α) (a : α) : Lang α := -- backslash delta
32+
fun (w : List α) => P (a :: w)
33+
34+
attribute [simp] ν δ
35+
36+
-- ν∅ : ν ∅ ≡ ⊥
37+
-- ν∅ = refl
38+
theorem nullable_emptySet:
39+
∀ (α: Type),
40+
@ν α ∅ ≡ PEmpty := by
41+
intro α
42+
constructor
43+
rfl
44+
45+
-- ν𝒰 : ν 𝒰 ≡ ⊤
46+
-- ν𝒰 = refl
47+
theorem nullable_universal:
48+
∀ (α: Type),
49+
@ν α 𝒰 ≡ PUnit := by
50+
intro α
51+
constructor
52+
rfl
53+
54+
-- ν𝟏 : ν 𝟏 ↔ ⊤
55+
-- ν𝟏 = mk↔′
56+
-- (λ { refl → tt })
57+
-- (λ { tt → refl })
58+
-- (λ { tt → refl })
59+
-- (λ { refl → refl })
60+
theorem nullable_emptyStr:
61+
∀ (α: Type),
62+
@ν α ε ↔ PUnit := by
63+
intro α
64+
refine Tiso.intro ?a ?b ?c ?d
65+
intro
66+
exact PUnit.unit
67+
intro
68+
exact trifle
69+
intro
70+
exact trifle
71+
simp
72+
intro x
73+
cases x with
74+
| _ => exact trifle
75+
76+
theorem nullable_emptyStr':
77+
∀ (α: Type),
78+
@ν α ε ↔ PUnit :=
79+
fun _ => Tiso.intro
80+
(fun _ => PUnit.unit)
81+
(fun _ => trifle)
82+
(sorry)
83+
(sorry)
84+
85+
-- ν` : ν (` c) ↔ ⊥
86+
-- ν` = mk↔′ (λ ()) (λ ()) (λ ()) (λ ())
87+
theorem nullable_char:
88+
∀ (c: α),
89+
ν (char c) ↔ PEmpty := by
90+
intro α
91+
simp
92+
apply Tiso.intro
93+
intro
94+
contradiction
95+
intro
96+
contradiction
97+
sorry
98+
sorry
99+
100+
theorem nullable_char':
101+
∀ (c: α),
102+
ν (char c) -> PEmpty := by
103+
intro
104+
refine (fun x => ?c)
105+
simp at x
106+
contradiction
107+
108+
-- set_option pp.all true
109+
-- #print nullable_char'
110+
111+
theorem t : 12 -> False := by
112+
intro
113+
contradiction
114+
115+
theorem t'' : 1 = 2 -> False := by
116+
intro
117+
contradiction
118+
119+
theorem t''' : 1 = 2 → False :=
120+
fun a => absurd a (of_decide_eq_false (Eq.refl (decide (1 = 2))))
121+
122+
theorem t' : 12 → False :=
123+
fun a =>
124+
(TEq.casesOn (motive := fun a_1 x => 2 = a_1 → HEq a x → False) a
125+
(fun h => Nat.noConfusion h fun n_eq => Nat.noConfusion n_eq) (Eq.refl 2) (HEq.refl a)).elim
126+
127+
theorem nullable_char'''.{u_2, u_1} : {α : Type u_1} → (c : α) → ν.{u_1} (Lang.char.{u_1} c) → PEmpty.{u_2} :=
128+
fun {α : Type u_1} (c : α) (x : ν.{u_1} (Lang.char.{u_1} c)) =>
129+
False.elim.{u_2}
130+
(False.elim.{0}
131+
(TEq.casesOn.{0, u_1} (motive := fun (a : List.{u_1} α) (x_1 : TEq.{u_1} List.nil.{u_1} a) =>
132+
Eq.{u_1 + 1} (List.cons.{u_1} c List.nil.{u_1}) a → HEq.{u_1 + 1} x x_1 → False) x
133+
(fun (h : Eq.{u_1 + 1} (List.cons.{u_1} c List.nil.{u_1}) List.nil.{u_1}) => List.noConfusion.{0, u_1} h)
134+
(Eq.refl.{u_1 + 1} (List.cons.{u_1} c List.nil.{u_1})) (HEq.refl.{u_1 + 1} x)))
135+
136+
-- ν∪ : ν (P ∪ Q) ≡ (ν P ⊎ ν Q)
137+
-- ν∪ = refl
138+
theorem nullable_or:
139+
∀ (P Q: Lang α),
140+
ν (P ⋃ Q) ≡ (Sum (ν P) (ν Q)) := by
141+
intro P Q
142+
rfl
143+
144+
-- ν∩ : ν (P ∩ Q) ≡ (ν P × ν Q)
145+
-- ν∩ = refl
146+
theorem nullable_and:
147+
∀ (P Q: Lang α),
148+
ν (P ⋂ Q) ≡ (Prod (ν P) (ν Q)) := by
149+
intro P Q
150+
rfl
151+
152+
-- ν· : ν (s · P) ≡ (s × ν P)
153+
-- ν· = refl
154+
theorem nullable_scalar:
155+
∀ (s: Type) (P: Lang α),
156+
ν (Lang.scalar s P) ≡ (Prod s (ν P)) := by
157+
intro P Q
158+
rfl
159+
160+
-- ν⋆ : ν (P ⋆ Q) ↔ (ν P × ν Q)
161+
-- ν⋆ = mk↔′
162+
-- (λ { (([] , []) , refl , νP , νQ) → νP , νQ })
163+
-- (λ { (νP , νQ) → ([] , []) , refl , νP , νQ })
164+
-- (λ { (νP , νQ) → refl } )
165+
-- (λ { (([] , []) , refl , νP , νQ) → refl})
166+
theorem nullable_concat:
167+
∀ (P Q: Lang α),
168+
ν (P, Q) ↔ (Prod (ν Q) (ν P)) := by
169+
-- TODO
170+
sorry
171+
172+
-- ν✪ : ν (P ✪) ↔ (ν P) ✶
173+
-- ν✪ {P = P} = mk↔′ k k⁻¹ invˡ invʳ
174+
-- where
175+
-- k : ν (P ✪) → (ν P) ✶
176+
-- k zero✪ = []
177+
-- k (suc✪ (([] , []) , refl , (νP , νP✪))) = νP ∷ k νP✪
178+
179+
-- k⁻¹ : (ν P) ✶ → ν (P ✪)
180+
-- k⁻¹ [] = zero✪
181+
-- k⁻¹ (νP ∷ νP✶) = suc✪ (([] , []) , refl , (νP , k⁻¹ νP✶))
182+
183+
-- invˡ : ∀ (νP✶ : (ν P) ✶) → k (k⁻¹ νP✶) ≡ νP✶
184+
-- invˡ [] = refl
185+
-- invˡ (νP ∷ νP✶) rewrite invˡ νP✶ = refl
186+
187+
-- invʳ : ∀ (νP✪ : ν (P ✪)) → k⁻¹ (k νP✪) ≡ νP✪
188+
-- invʳ zero✪ = refl
189+
-- invʳ (suc✪ (([] , []) , refl , (νP , νP✪))) rewrite invʳ νP✪ = refl
190+
191+
-- ν☆ : ν (P ☆) ↔ (ν P) ✶
192+
-- ν☆ {P = P} =
193+
-- begin
194+
-- ν (P ☆)
195+
-- ≈˘⟨ ✪↔☆ ⟩
196+
-- ν (P ✪)
197+
-- ≈⟨ ν✪ ⟩
198+
-- (ν P) ✶
199+
-- ∎ where open ↔R
200+
theorem nullable_star:
201+
∀ (P: Lang α),
202+
ν (P *) ↔ List (ν P) := by
203+
-- TODO
204+
sorry
205+
206+
-- δ∅ : δ ∅ a ≡ ∅
207+
-- δ∅ = refl
208+
theorem derivative_emptySet:
209+
∀ (a: α),
210+
(δ ∅ a) ≡ ∅ := by
211+
intro a
212+
rfl
213+
214+
-- δ𝒰 : δ 𝒰 a ≡ 𝒰
215+
-- δ𝒰 = refl
216+
theorem derivative_universal:
217+
∀ (a: α),
218+
(δ 𝒰 a) ≡ 𝒰 := by
219+
intro a
220+
rfl
221+
222+
-- δ𝟏 : δ 𝟏 a ⟷ ∅
223+
-- δ𝟏 = mk↔′ (λ ()) (λ ()) (λ ()) (λ ())
224+
-- TODO: Redo this definition to do extensional isomorphism: `⟷` properly
225+
theorem derivative_emptyStr:
226+
∀ (a: α),
227+
(δ ε a) ≡ ∅ := by
228+
-- TODO
229+
sorry
230+
231+
-- δ` : δ (` c) a ⟷ (a ≡ c) · 𝟏
232+
-- δ` = mk↔′
233+
-- (λ { refl → refl , refl })
234+
-- (λ { (refl , refl) → refl })
235+
-- (λ { (refl , refl) → refl })
236+
-- (λ { refl → refl })
237+
-- TODO: Redo this definition to do extensional isomorphism: `⟷` properly
238+
theorem derivative_char:
239+
∀ (a: α) (c: α),
240+
(δ (char c) a) ≡ Lang.scalar (a ≡ c) ε := by
241+
intros a c
242+
unfold δ
243+
unfold char
244+
unfold emptyStr
245+
unfold scalar
246+
sorry
247+
248+
-- δ∪ : δ (P ∪ Q) a ≡ δ P a ∪ δ Q a
249+
-- δ∪ = refl
250+
theorem derivative_or:
251+
∀ (a: α) (P Q: Lang α),
252+
(δ (P ⋃ Q) a) ≡ ((δ P a) ⋃ (δ Q a)) := by
253+
intro a P Q
254+
rfl
255+
256+
-- δ∩ : δ (P ∩ Q) a ≡ δ P a ∩ δ Q a
257+
-- δ∩ = refl
258+
theorem derivative_and:
259+
∀ (a: α) (P Q: Lang α),
260+
(δ (P ⋂ Q) a) ≡ ((δ P a) ⋂ (δ Q a)) := by
261+
intro a P Q
262+
rfl
263+
264+
-- δ· : δ (s · P) a ≡ s · δ P a
265+
-- δ· = refl
266+
theorem derivative_scalar:
267+
∀ (a: α) (s: Type) (P: Lang α),
268+
(δ (Lang.scalar s P) a) ≡ (Lang.scalar s (δ P a)) := by
269+
intro a s P
270+
rfl
271+
272+
-- δ⋆ : δ (P ⋆ Q) a ⟷ ν P · δ Q a ∪ δ P a ⋆ Q
273+
-- δ⋆ {a = a} {w = w} = mk↔′
274+
-- (λ { (([] , .(a ∷ w)) , refl , νP , Qaw) → inj₁ (νP , Qaw)
275+
-- ; ((.a ∷ u , v) , refl , Pu , Qv) → inj₂ ((u , v) , refl , Pu , Qv) })
276+
-- (λ { (inj₁ (νP , Qaw)) → ([] , a ∷ w) , refl , νP , Qaw
277+
-- ; (inj₂ ((u , v) , refl , Pu , Qv)) → ((a ∷ u , v) , refl , Pu , Qv) })
278+
-- (λ { (inj₁ (νP , Qaw)) → refl
279+
-- ; (inj₂ ((u , v) , refl , Pu , Qv)) → refl })
280+
-- (λ { (([] , .(a ∷ w)) , refl , νP , Qaw) → refl
281+
-- ; ((.a ∷ u , v) , refl , Pu , Qv) → refl })
282+
-- TODO: Redo this definition to do extensional isomorphism: `⟷` properly
283+
theorem derivative_concat:
284+
∀ (a: α) (P Q: Lang α),
285+
-- TODO: Redo this definition to do extensional isomorphism: `⟷` properly
286+
(δ (P , Q) a) ≡ Lang.scalar (ν P) ((δ Q a) ⋃ ((δ P a), Q)) := by
287+
-- TODO
288+
sorry
289+
290+
-- δ✪ : δ (P ✪) a ⟷ (ν P) ✶ · (δ P a ⋆ P ✪)
291+
-- δ✪ {P}{a} {w} = mk↔′ k k⁻¹ invˡ invʳ
292+
-- where
293+
-- k : δ (P ✪) a w → ((ν P) ✶ · (δ P a ⋆ P ✪)) w
294+
-- k (suc✪ (([] , .(a ∷ w)) , refl , (νP , P✪a∷w))) with k P✪a∷w
295+
-- ... | νP✶ , etc
296+
-- = νP ∷ νP✶ , etc
297+
-- k (suc✪ ((.a ∷ u , v) , refl , (Pa∷u , P✪v))) = [] , (u , v) , refl , (Pa∷u , P✪v)
298+
299+
-- k⁻¹ : ((ν P) ✶ · (δ P a ⋆ P ✪)) w → δ (P ✪) a w
300+
-- k⁻¹ ([] , (u , v) , refl , (Pa∷u , P✪v)) = (suc✪ ((a ∷ u , v) , refl , (Pa∷u , P✪v)))
301+
-- k⁻¹ (νP ∷ νP✶ , etc) = (suc✪ (([] , a ∷ w) , refl , (νP , k⁻¹ (νP✶ , etc))))
302+
303+
-- invˡ : (s : ((ν P) ✶ · (δ P a ⋆ P ✪)) w) → k (k⁻¹ s) ≡ s
304+
-- invˡ ([] , (u , v) , refl , (Pa∷u , P✪v)) = refl
305+
-- invˡ (νP ∷ νP✶ , etc) rewrite invˡ (νP✶ , etc) = refl
306+
307+
-- invʳ : (s : δ (P ✪) a w) → k⁻¹ (k s) ≡ s
308+
-- invʳ (suc✪ (([] , .(a ∷ w)) , refl , (νP , P✪a∷w))) rewrite invʳ P✪a∷w = refl
309+
-- invʳ (suc✪ ((.a ∷ u , v) , refl , (Pa∷u , P✪v))) = refl
310+
311+
-- δ☆ : δ (P ☆) a ⟷ (ν P) ✶ · (δ P a ⋆ P ☆)
312+
-- δ☆ {P = P}{a} {w} =
313+
-- begin
314+
-- δ (P ☆) a w
315+
-- ≈˘⟨ ✪↔☆ ⟩
316+
-- δ (P ✪) a w
317+
-- ≈⟨ δ✪ ⟩
318+
-- ((ν P) ✶ · (δ P a ⋆ P ✪)) w
319+
-- ≈⟨ ×-congˡ (⋆-congˡ ✪↔☆) ⟩
320+
-- ((ν P) ✶ · (δ P a ⋆ P ☆)) w
321+
-- ∎ where open ↔R
322+
-- TODO: Redo this definition to do extensional isomorphism: `⟷` properly
323+
theorem derivative_star:
324+
∀ (a: α) (P: Lang α),
325+
-- TODO: Redo this definition to do extensional isomorphism: `⟷` properly
326+
(δ (P *) a) ≡ Lang.scalar (List (ν P)) (δ P a, P *) := by
327+
-- TODO
328+
sorry

0 commit comments

Comments
 (0)