|
| 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