|
| 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 : 1 ≡ 2 -> 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' : 1 ≡ 2 → 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