Skip to content

Commit 3e67812

Browse files
committed
Try skirting axiom of choice
1 parent 64e0450 commit 3e67812

1 file changed

Lines changed: 105 additions & 13 deletions

File tree

Munkres/Mathlib/MonotoneSubseq.lean

Lines changed: 105 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ import Munkres.Mathlib.Prelude
33

44
open Set Filter Topology TopologicalSpace
55

6-
variable {x : ℕ → ℝ}
6+
universe u
77

8-
private def IsPeak (x : ℕ → ℝ) (n : ℕ) := ∀ m ≥ n, x m ≤ x n
8+
variable {α : Type u} [Preorder α]
9+
{x : ℕ → ℝ}
10+
11+
private def IsPeak₂ (x : ℕ → ℝ) (n : ℕ) : Prop := Minimal (· ∈ Set.range x) n
12+
noncomputable example : DecidablePred fun n ↦ IsPeak₂ x n := by
13+
exact Classical.decPred fun n ↦ IsPeak₂ x n
14+
private def IsPeak (x : ℕ → ℝ) (n : ℕ) : Prop := ∀ m ≥ n, x m ≤ x n
915

1016
private lemma p' {n : ℕ} (h : ¬IsPeak x n) : ∃ m > n, x m > x n
1117
:= by --
@@ -18,20 +24,88 @@ private lemma p' {n : ℕ} (h : ¬IsPeak x n) : ∃ m > n, x m > x n
1824
exact (lt_self_iff_false (x m)).mp hlt
1925
exact ⟨m, hmn.lt_of_ne' this, hlt⟩ -- ∎
2026

21-
private structure Node (x : ℕ → ℝ) (N : ℕ) where
27+
private structure Node (N : ℕ) where
2228
n : ℕ
2329
ge' : n ≥ N
2430

2531
private noncomputable def ζ {x : ℕ → ℝ} {N : ℕ}
26-
(h : ∀ n ≥ N, ∃ m > n, x m > x n) : ℕ → Node x N
32+
(h : ∀ n ≥ N, ∃ m > n, x m > x n) : ℕ → Node N
2733
| 0 => { n := N, ge' := le_rfl }
2834
| n + 1 => by
2935
let p := ζ h n
30-
let m := (h p.n p.ge').choose
31-
have hm := (h p.n p.ge').choose_spec.1
36+
have : DecidablePred fun m ↦ m > n ∧ x m > x n := by
37+
sorry
38+
let m := Nat.find <| h p.n p.ge'
39+
have hm := (Nat.find_spec (h p.n p.ge')).1
3240
exact { n := m, ge' := p.ge'.trans hm.le }
3341

34-
noncomputable example {x : ℕ → ℝ}
42+
private structure Node₂ (x : ℕ → ℝ) where
43+
n : ℕ
44+
peak' : IsPeak x n
45+
46+
47+
private noncomputable def ψ {x : ℕ → ℝ}
48+
(h : ∀ N, ∃ n > N, IsPeak x n) : ℕ → Node₂ x
49+
| 0 => by
50+
specialize h 0
51+
exact { n := h.choose, peak' := h.choose_spec.2 }
52+
| n + 1 => by
53+
let p := ψ h n
54+
specialize h p.n
55+
exact { n := h.choose, peak' := h.choose_spec.2 }
56+
57+
58+
example {x : Fin 0} : False := by
59+
have : x.val < 0 := x.prop
60+
exact Nat.not_succ_le_zero (↑x) this
61+
62+
private lemma l₁ {α : Type u} [Preorder α] [h₀ : Inhabited α] {A : Set α}
63+
(hA : A.Finite) : (upperBounds A).Nonempty := by
64+
have : Finite A := hA
65+
rw [finite_iff_exists_equiv_fin] at this
66+
obtain ⟨n, φ, ψ, h₁, h₂⟩ := this
67+
induction n with
68+
| zero =>
69+
use h₀.default
70+
intro x hx
71+
let φ : A ≃ Fin 0 := { toFun := φ, invFun := ψ, left_inv := h₁, right_inv := h₂ }
72+
let n := φ ⟨x, hx⟩
73+
refine False.elim <| Nat.not_succ_le_zero n n.prop
74+
| succ n ih =>
75+
sorry
76+
#print axioms l₁
77+
78+
private lemma mono {x : ℕ → α} (hPf : (Set.range x).Finite)
79+
: ∃ φ : ℕ → ℕ, StrictMono φ ∧ Monotone (x ∘ φ)
80+
:= by
81+
let P := Set.range x
82+
-- have : P.Finite := hPf
83+
-- let P' := hPf.toFinset
84+
have : ∃ N, ∀ n ∈ P, n < N := by
85+
-- if hP : P = ∅ then
86+
-- sorry
87+
-- else
88+
sorry
89+
-- if hP₀ : P'.Nonempty then
90+
-- use P'.max' hP₀ + 1
91+
-- intro n hn
92+
-- rw [<-hPf.mem_toFinset] at hn
93+
-- -- rw [Order.lt_add_one_iff]
94+
-- -- exact P'.le_max' n hn
95+
-- sorry
96+
-- else
97+
-- have hP₀ : P = ∅ := by
98+
-- have : P' = ∅ := Finset.not_nonempty_iff_eq_empty.mp hP₀
99+
-- exact Finite.toFinset_eq_empty.mp this
100+
-- use 0
101+
-- intro n hn
102+
-- rw [hP₀] at hn
103+
-- exact False.elim hn
104+
-- obtain ⟨N, hN⟩ := this
105+
sorry
106+
-- #print axioms mono
107+
108+
private lemma both {x : ℕ → ℝ}
35109
: ∃ φ : ℕ → ℕ, StrictMono φ ∧ (Monotone (x ∘ φ) ∨ Antitone (x ∘ φ))
36110
:= by
37111
let P := { n | IsPeak x n }
@@ -66,23 +140,41 @@ noncomputable example {x : ℕ → ℝ}
66140
intro n
67141
let p := ζ hδ n
68142
specialize hδ (φ n) p.ge'
69-
exact hδ.choose_spec.1
143+
exact (Nat.find_spec hδ).1
70144
· refine monotone_nat_of_le_succ ?_
71145
intro n
72146
let p := ζ hδ n
73147
specialize hδ (φ n) p.ge'
74-
exact hδ.choose_spec.2.le
148+
exact (Nat.find_spec hδ).2.le
75149
else
76-
have : ∀ N, ∃ n N, IsPeak x n := by
150+
have h : ∀ N, ∃ n > N, IsPeak x n := by
77151
intro N
78152
by_contra! h
79-
have h : P ⊆ Finset.range N := by
153+
let R := Finset.range (N + 1)
154+
have h : P ⊆ R := by
80155
rw [Finset.coe_range]
81156
intro n hnP
82157
by_contra! hn
83158
rw [notMem_Iio] at hn
84159
exact (h n hn) hnP
85-
have : (SetLike.coe <| Finset.range N).Finite := (Finset.range N).finite_toSet
160+
have : (SetLike.coe R).Finite := R.finite_toSet
86161
have : P.Finite := this.subset h
87162
exact hPf this
88-
sorry
163+
let φ (n : ℕ) : ℕ := (ψ h n).n
164+
refine ⟨φ, ?_, Or.inr ?_⟩
165+
· refine strictMono_nat_of_lt_succ ?_
166+
intro n
167+
let p := ψ h n
168+
exact (h p.n).choose_spec.1
169+
· refine antitone_nat_of_succ_le ?_
170+
intro n
171+
let p := ψ h n
172+
simp only [Function.comp_apply]
173+
have hp : IsPeak x (φ n) := by
174+
match n with
175+
| 0 => exact (h 0).choose_spec.2
176+
| n + 1 => exact (h (ψ h n).n).choose_spec.2
177+
have : φ n < φ (n + 1) := (h p.n).choose_spec.1
178+
exact hp (φ (n + 1)) this.le
179+
180+
-- #print axioms mono

0 commit comments

Comments
 (0)