Skip to content

Commit 0b16eea

Browse files
committed
feat: add Cslib/Computability/Languages/OmegaLanguage.lean
1 parent 7f08527 commit 0b16eea

File tree

2 files changed

+179
-0
lines changed

2 files changed

+179
-0
lines changed

Cslib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Cslib.Computability.Automata.EpsilonNFAToNFA
66
import Cslib.Computability.Automata.NA
77
import Cslib.Computability.Automata.NFA
88
import Cslib.Computability.Automata.NFAToDFA
9+
import Cslib.Computability.Languages.OmegaLanguage
910
import Cslib.Foundations.Control.Monad.Free
1011
import Cslib.Foundations.Control.Monad.Free.Effects
1112
import Cslib.Foundations.Control.Monad.Free.Fold
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
/-
2+
Copyright (c) 2025-present Ching-Tsun Chou All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Ching-Tsun Chou
5+
-/
6+
import Cslib.Foundations.Data.OmegaSequence.Init
7+
import Mathlib.Computability.Language
8+
import Mathlib.Order.Filter.AtTopBot.Defs
9+
import Mathlib.Tactic
10+
11+
/-!
12+
# ωLanguage
13+
14+
This file contains the definition and operations on formal ω-languages, which
15+
are sets of infinite sequences over an alphabet `α`, namely, objects of type
16+
`ωSequence α`.
17+
18+
## Notations
19+
20+
In general we will use `p` and `q` to denote ω-languages and `l` and `m` to
21+
denote languages (namely, sets of finite sequences of type `List α`).
22+
23+
* `p ∪ q`, `p ∩ q`, `pᶜ`, `∅`: the usual set operations.
24+
* `l * p`: ω-language of `x ++ω y` where `x ∈ l` and `y ∈ p`.
25+
* `l ^ω`: ω-language of infinite sequences each of which is the concatenation of
26+
infinitely many (non-nil) members of `l`.
27+
* `l ↗ω`: ω-language of infinite sequences each of which has infinitely many
28+
prefixes in `l`.
29+
30+
## Main definitions
31+
32+
* `ωLanguage α`: a set of infinite sequences over the alphabet `α`
33+
* `p.map f`: transform an ω-language `p` over `α` into an ω-language over `β`
34+
by translating through `f : α → β`
35+
36+
## Main theorems
37+
38+
-/
39+
40+
namespace Cslib
41+
42+
open List Set Filter Computability
43+
44+
universe v
45+
46+
variable {α β γ : Type*}
47+
48+
/-- An ω-language is a set of strings over an alphabet. -/
49+
def ωLanguage (α) :=
50+
Set (ωSequence α)
51+
52+
namespace ωLanguage
53+
54+
instance : Membership (ωSequence α) (ωLanguage α) := ⟨Set.Mem⟩
55+
instance : Singleton (ωSequence α) (ωLanguage α) := ⟨Set.singleton⟩
56+
instance : Insert (ωSequence α) (ωLanguage α) := ⟨Set.insert⟩
57+
instance instCompleteAtomicBooleanAlgebra : CompleteAtomicBooleanAlgebra (ωLanguage α) :=
58+
Set.instCompleteAtomicBooleanAlgebra
59+
60+
variable {l m : Language α} {p q : ωLanguage α} {a b x : List α} {s t : ωSequence α}
61+
62+
instance : Inhabited (ωLanguage α) := ⟨(∅ : Set _)⟩
63+
64+
/-- ω-language ∅ has no elements. -/
65+
instance : EmptyCollection (ωLanguage α) :=
66+
⟨(∅ : Set _)⟩
67+
68+
theorem empty_def : (∅ : ωLanguage α) = (∅ : Set (ωSequence α)) :=
69+
rfl
70+
71+
/-- The union of two ω-languages. -/
72+
instance : Union (ωLanguage α) :=
73+
⟨((· ∪ ·) : Set (ωSequence α) → Set (ωSequence α) → Set (ωSequence α))⟩
74+
75+
theorem union_def (p q : ωLanguage α) : p ∪ q = (p ∪ q : Set (ωSequence α)) :=
76+
rfl
77+
78+
/-- The intersection of two ω-languages. -/
79+
instance : Inter (ωLanguage α) :=
80+
⟨((· ∩ ·) : Set (ωSequence α) → Set (ωSequence α) → Set (ωSequence α))⟩
81+
82+
theorem inter_def (p q : ωLanguage α) : p ∩ q = (p ∩ q : Set (ωSequence α)) :=
83+
rfl
84+
85+
theorem compl_def (p : ωLanguage α) : pᶜ = (pᶜ : Set (ωSequence α)) :=
86+
rfl
87+
88+
/-- The product of a language l and an ω-language `p` is the ω-language made of
89+
infinite sequences `x ++ω y` where `x ∈ l` and `y ∈ p`. -/
90+
instance : HMul (Language α) (ωLanguage α) (ωLanguage α) :=
91+
⟨image2 (· ++ω ·)⟩
92+
93+
theorem hmul_def (l : Language α) (p : ωLanguage α) : l * p = image2 (· ++ω ·) l p :=
94+
rfl
95+
96+
/-- Concatenation of infinitely many copies of a languages, resulting in an ω-language.
97+
A.k.a. ω-power.
98+
-/
99+
def omegaPower (l : Language α) : ωLanguage α :=
100+
{ s | ∃ φ : ℕ → ℕ, StrictMono φ ∧ φ 0 = 0 ∧ ∀ m, s.extract (φ m) (φ (m + 1)) ∈ l }
101+
102+
/-- Use the postfix notation ^ω` for `omegaPower`. -/
103+
@[notation_class]
104+
class OmegaPower (α : Type*) (β : outParam (Type*)) where
105+
omegaPower : α → β
106+
107+
postfix:1024 "^ω" => OmegaPower.omegaPower
108+
109+
instance : OmegaPower (Language α) (ωLanguage α) :=
110+
{ omegaPower := omegaPower }
111+
112+
theorem omegaPower_def (l : Language α) :
113+
l^ω = { s | ∃ φ : ℕ → ℕ, StrictMono φ ∧ φ 0 = 0 ∧ ∀ m, s.extract (φ m) (φ (m + 1)) ∈ l }
114+
:= rfl
115+
116+
/- The ω-limit of a language `l` is the ω-language of infinite sequences each of which
117+
contains infinitely many prefixes in `l`.
118+
-/
119+
def omegaLimit (l : Language α) : ωLanguage α :=
120+
{ s | ∃ᶠ m in atTop, s.extract 0 m ∈ l }
121+
122+
/-- Use the postfix notation ↗ω` for `omegaLimit`. -/
123+
@[notation_class]
124+
class OmegaLimit (α : Type*) (β : outParam (Type*)) where
125+
omegaLimit : α → β
126+
127+
postfix:1024 "↗ω" => OmegaLimit.omegaLimit
128+
129+
instance instOmegaLimit : OmegaLimit (Language α) (ωLanguage α) :=
130+
{ omegaLimit := omegaLimit }
131+
132+
theorem omegaLimit_def (l : Language α) :
133+
l↗ω = { s | ∃ᶠ m in atTop, s.extract 0 m ∈ l } :=
134+
rfl
135+
136+
def map (f : α → β) : ωLanguage α → ωLanguage β := image (ωSequence.map f)
137+
138+
theorem map_def (f : α → β) (p : ωLanguage α) :
139+
p.map f = image (ωSequence.map f) p :=
140+
rfl
141+
142+
@[ext]
143+
theorem ext (h : ∀ (s : ωSequence α), s ∈ p ↔ s ∈ q) : p = q :=
144+
Set.ext h
145+
146+
@[simp]
147+
theorem notMem_empty (s : ωSequence α) : s ∉ (∅ : ωLanguage α) :=
148+
id
149+
150+
@[simp]
151+
theorem mem_union (p q : ωLanguage α) (s : ωSequence α) : s ∈ p ∪ q ↔ s ∈ p ∨ s ∈ q :=
152+
Iff.rfl
153+
154+
@[simp]
155+
theorem mem_inter (p q : ωLanguage α) (s : ωSequence α) : s ∈ p ∩ q ↔ s ∈ p ∧ s ∈ q :=
156+
Iff.rfl
157+
158+
@[simp]
159+
theorem mem_compl (p : ωLanguage α) (s : ωSequence α) : s ∈ pᶜ ↔ ¬ s ∈ p :=
160+
Iff.rfl
161+
162+
theorem mem_hmul : s ∈ l * p ↔ ∃ x ∈ l, ∃ t ∈ p, x ++ω t = s :=
163+
mem_image2
164+
165+
theorem append_mem_hmul : x ∈ l → s ∈ p → x ++ω s ∈ l * p :=
166+
mem_image2_of_mem
167+
168+
@[simp]
169+
theorem map_id (p : ωLanguage α) : map id p = p :=
170+
by simp [map]
171+
172+
@[simp]
173+
theorem map_map (g : β → γ) (f : α → β) (p : ωLanguage α) : map g (map f p) = map (g ∘ f) p := by
174+
simp [map, image_image]
175+
176+
end ωLanguage
177+
178+
end Cslib

0 commit comments

Comments
 (0)