Skip to content

Commit 6d11a98

Browse files
Hott alternatives for Language and Calculus
1 parent a5256b1 commit 6d11a98

File tree

4 files changed

+453
-10
lines changed

4 files changed

+453
-10
lines changed

Katydid.lean

+13-10
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import Katydid.Std.Lists
2-
import Katydid.Std.Ltac
3-
import Katydid.Std.Balistic
4-
import Katydid.Std.TDecidable
5-
import Katydid.Std.Tipe
1+
-- import Katydid.Std.Lists
2+
-- import Katydid.Std.Ltac
3+
-- import Katydid.Std.Balistic
4+
-- import Katydid.Std.TDecidable
5+
-- import Katydid.Std.Tipe
66

7-
import Katydid.Conal.Language
8-
import Katydid.Conal.LanguageNotation
9-
import Katydid.Conal.RegexNotation
10-
import Katydid.Conal.Calculus
11-
import Katydid.Conal.Examples
7+
-- import Katydid.Conal.Language
8+
-- import Katydid.Conal.LanguageNotation
9+
-- import Katydid.Conal.RegexNotation
10+
-- import Katydid.Conal.Calculus
11+
-- import Katydid.Conal.Examples
12+
import Katydid.Conal.LanguageHott
13+
import Katydid.Conal.LanguageNotationHott
14+
import Katydid.Conal.CalculusHott

Katydid/Conal/CalculusHott.lean

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

0 commit comments

Comments
 (0)