Skip to content

Commit caff963

Browse files
committed
feat: add Cslib/Computability/Languages/OmegaLanguage.lean
1 parent 87b4bf0 commit caff963

File tree

2 files changed

+175
-0
lines changed

2 files changed

+175
-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: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
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+
open List Set Filter Computability
41+
42+
universe v
43+
44+
variable {α β γ : Type*}
45+
46+
/-- An ω-language is a set of strings over an alphabet. -/
47+
def ωLanguage (α) :=
48+
Set (ωSequence α)
49+
50+
namespace ωLanguage
51+
52+
instance : Membership (ωSequence α) (ωLanguage α) := ⟨Set.Mem⟩
53+
instance : Singleton (ωSequence α) (ωLanguage α) := ⟨Set.singleton⟩
54+
instance : Insert (ωSequence α) (ωLanguage α) := ⟨Set.insert⟩
55+
instance instCompleteAtomicBooleanAlgebra : CompleteAtomicBooleanAlgebra (ωLanguage α) :=
56+
Set.instCompleteAtomicBooleanAlgebra
57+
58+
variable {l m : Language α} {p q : ωLanguage α} {a b x : List α} {s t : ωSequence α}
59+
60+
instance : Inhabited (ωLanguage α) := ⟨(∅ : Set _)⟩
61+
62+
/-- ω-language ∅ has no elements. -/
63+
instance : EmptyCollection (ωLanguage α) :=
64+
⟨(∅ : Set _)⟩
65+
66+
theorem empty_def : (∅ : ωLanguage α) = (∅ : Set (ωSequence α)) :=
67+
rfl
68+
69+
/-- The union of two ω-languages. -/
70+
instance : Union (ωLanguage α) :=
71+
⟨((· ∪ ·) : Set (ωSequence α) → Set (ωSequence α) → Set (ωSequence α))⟩
72+
73+
theorem union_def (p q : ωLanguage α) : p ∪ q = (p ∪ q : Set (ωSequence α)) :=
74+
rfl
75+
76+
/-- The intersection of two ω-languages. -/
77+
instance : Inter (ωLanguage α) :=
78+
⟨((· ∩ ·) : Set (ωSequence α) → Set (ωSequence α) → Set (ωSequence α))⟩
79+
80+
theorem inter_def (p q : ωLanguage α) : p ∩ q = (p ∩ q : Set (ωSequence α)) :=
81+
rfl
82+
83+
theorem compl_def (p : ωLanguage α) : pᶜ = (pᶜ : Set (ωSequence α)) :=
84+
rfl
85+
86+
/-- The product of a language l and an ω-language `p` is the ω-language made of
87+
infinite sequences `x ++ω y` where `x ∈ l` and `y ∈ p`. -/
88+
instance : HMul (Language α) (ωLanguage α) (ωLanguage α) :=
89+
⟨image2 (· ++ω ·)⟩
90+
91+
theorem hmul_def (l : Language α) (p : ωLanguage α) : l * p = image2 (· ++ω ·) l p :=
92+
rfl
93+
94+
/-- Concatenation of infinitely many copies of a languages, resulting in an ω-language.
95+
A.k.a. ω-power.
96+
-/
97+
def omegaPower (l : Language α) : ωLanguage α :=
98+
{ s | ∃ φ : ωSequence ℕ, StrictMono φ ∧ φ 0 = 0 ∧ ∀ m, s.extract (φ m) (φ (m + 1)) ∈ l }
99+
100+
/-- Use the postfix notation ^ω` for `omegaPower`. -/
101+
@[notation_class]
102+
class OmegaPower (α : Type*) (β : outParam (Type*)) where
103+
omegaPower : α → β
104+
105+
postfix:1024 "^ω" => OmegaPower.omegaPower
106+
107+
instance : OmegaPower (Language α) (ωLanguage α) :=
108+
{ omegaPower := omegaPower }
109+
110+
theorem omegaPower_def (l : Language α) :
111+
l^ω = { s | ∃ φ : ωSequence ℕ, StrictMono φ ∧ φ 0 = 0 ∧ ∀ m, s.extract (φ m) (φ (m + 1)) ∈ l }
112+
:= rfl
113+
114+
/- The ω-limit of a language `l` is the ω-language of infinite sequences each of which
115+
contains infinitely many prefixes in `l`.
116+
-/
117+
def omegaLimit (l : Language α) : ωLanguage α :=
118+
{ s | ∃ᶠ m in atTop, s.extract 0 m ∈ l }
119+
120+
/-- Use the postfix notation ↗ω` for `omegaLimit`. -/
121+
@[notation_class]
122+
class OmegaLimit (α : Type*) (β : outParam (Type*)) where
123+
omegaLimit : α → β
124+
125+
postfix:1024 "↗ω" => OmegaLimit.omegaLimit
126+
127+
instance instOmegaLimit : OmegaLimit (Language α) (ωLanguage α) :=
128+
{ omegaLimit := omegaLimit }
129+
130+
theorem omegaLimit_def (l : Language α) :
131+
l↗ω = { s | ∃ᶠ m in atTop, s.extract 0 m ∈ l } :=
132+
rfl
133+
134+
def map (f : α → β) : ωLanguage α → ωLanguage β := image (ωSequence.map f)
135+
136+
theorem map_def (f : α → β) (p : ωLanguage α) :
137+
p.map f = image (ωSequence.map f) p :=
138+
rfl
139+
140+
@[ext]
141+
theorem ext (h : ∀ (s : ωSequence α), s ∈ p ↔ s ∈ q) : p = q :=
142+
Set.ext h
143+
144+
@[simp]
145+
theorem notMem_empty (s : ωSequence α) : s ∉ (∅ : ωLanguage α) :=
146+
id
147+
148+
@[simp]
149+
theorem mem_union (p q : ωLanguage α) (s : ωSequence α) : s ∈ p ∪ q ↔ s ∈ p ∨ s ∈ q :=
150+
Iff.rfl
151+
152+
@[simp]
153+
theorem mem_inter (p q : ωLanguage α) (s : ωSequence α) : s ∈ p ∩ q ↔ s ∈ p ∧ s ∈ q :=
154+
Iff.rfl
155+
156+
@[simp]
157+
theorem mem_compl (p : ωLanguage α) (s : ωSequence α) : s ∈ pᶜ ↔ ¬ s ∈ p :=
158+
Iff.rfl
159+
160+
theorem mem_hmul : s ∈ l * p ↔ ∃ x ∈ l, ∃ t ∈ p, x ++ω t = s :=
161+
mem_image2
162+
163+
theorem append_mem_hmul : x ∈ l → s ∈ p → x ++ω s ∈ l * p :=
164+
mem_image2_of_mem
165+
166+
@[simp]
167+
theorem map_id (p : ωLanguage α) : map id p = p :=
168+
by simp [map]
169+
170+
@[simp]
171+
theorem map_map (g : β → γ) (f : α → β) (p : ωLanguage α) : map g (map f p) = map (g ∘ f) p := by
172+
simp [map, image_image]
173+
174+
end ωLanguage

0 commit comments

Comments
 (0)