The minimal bad sequence argument, slightly generalized.
```agda
module MinimalBadSeq where
import Relation.Binary.PropositionalEquality as Eq
open Eq using (_≡_; refl; _≢_; sym; trans; cong; cong-app; subst)
open import Data.Nat using (ℕ; zero; suc; _∸_; _≤_; s≤s; z≤n; _<_)
open import Data.Nat.Properties
using (≤-reflexive; ≤-refl; ≤-trans; <-trans; <-irrefl; <⇒≤; <-transʳ; ≤⇒≯; n∸n≡0; ∸-monoˡ-<)
open import Data.Product using (Σ; _×_; _,_; proj₁; proj₂ ; ∃; Σ-syntax; ∃-syntax; ∃₂)
open import Data.Sum using (_⊎_; inj₁; inj₂) renaming ([_,_]′ to case-⊎)
open import Relation.Nullary using (¬_)
open import Data.Unit using (⊤; tt)
open import Data.Empty using (⊥; ⊥-elim)
open import Relation.Unary using (_∈_)
open import Function using (_∘_; id)
open import Miscellaneous
open import Classical
open import WQO
```
"Induction step" of the construction of MBS.
```agda
module MinSeqStep {A : Set} (μ : A → ℕ) (P : (ℕ → A) → Set) (P-nonempty : NonEmpty P) where
μP : (ℕ → ℕ) → Set
μP = (μ ∘_) [ P ]
μP-nonempty : NonEmpty μP
μP-nonempty = nonempty-image (μ ∘_) P P-nonempty
record MinSeqAt (n : ℕ) : Set where
field
seq : ℕ → A
member : seq ∈ P
minimal : (g : ℕ → A) → g ∈ P → μ (seq n) ≤ μ (g n)
minSeqAt : (n : ℕ) → MinSeqAt n
minSeqAt n =
record
{ seq = f
; member = f∈P
; minimal = f-minimal
}
where
lμP : Σ[ f₁ ∈ (ℕ → ℕ) ] (f₁ ∈ μP × ((g₁ : ℕ → ℕ) → g₁ ∈ μP → f₁ n ≤ g₁ n))
lμP = leastSeqAt μP-nonempty n
f₁ = proj₁ lμP
f₁∈μP = proj₁ (proj₂ lμP)
f = proj₁ f₁∈μP
f∈P : f ∈ P
f∈P = proj₁ (proj₂ f₁∈μP)
μ∘f≡f₁ : μ ∘ f ≡ f₁
μ∘f≡f₁ = proj₂ (proj₂ f₁∈μP)
f₁-minimal : (g₁ : ℕ → ℕ) → g₁ ∈ μP → f₁ n ≤ g₁ n
f₁-minimal = proj₂ (proj₂ lμP)
f-minimal : (g : ℕ → A) → g ∈ P → μ (f n) ≤ μ (g n)
f-minimal g g∈P rewrite cong-app μ∘f≡f₁ n = f₁-minimal g₁ g₁∈μP
where
g₁ = μ ∘ g
g₁∈μP : g₁ ∈ μP
g₁∈μP = member-image (μ ∘_) P g∈P
```
The constructon of the minimal "bad" sequence is relativized to the predicate P.
We construct the minimal sequence with respect to P, which is known to be nonempty.
```agda
module MBS-helper {A : Set} (μ : A → ℕ) (P : (ℕ → A) → Set) (P-nonempty : NonEmpty P) where
open MinSeqStep {A} μ
P′ : ℕ → (ℕ → A) → Set
P′-nonempty : (n : ℕ) → NonEmpty (P′ n)
mbs-helper : (n : ℕ) → MinSeqAt (P′ n) (P′-nonempty n) n
mbs-helper-seq : ℕ → ℕ → A
mbs-helper-member : (n : ℕ) → mbs-helper-seq n ∈ P
P′ zero = P
P′ (suc n) g = g ∈ P × AgreeUpTo n (mbs-helper-seq n) g
P′-nonempty 0 = P-nonempty
P′-nonempty (suc n) = mbs-helper-seq n , mbs-helper-member n , agreeUpTo-reflexive n (mbs-helper-seq n)
mbs-helper n = minSeqAt (P′ n) (P′-nonempty n) n
mbs-helper-seq n = MinSeqAt.seq (mbs-helper n)
mbs-helper-member zero = MinSeqAt.member (mbs-helper zero)
mbs-helper-member (suc n) = proj₁ (MinSeqAt.member (mbs-helper (suc n)))
mbs-helper-minimal : (n : ℕ) (g : ℕ → A) → g ∈ P′ n → μ (mbs-helper-seq n n) ≤ μ (g n)
mbs-helper-minimal n = MinSeqAt.minimal (mbs-helper n)
mbs-helper-agreeUpTo : (m n : ℕ) → m ≤ n → AgreeUpTo m (mbs-helper-seq m) (mbs-helper-seq n)
mbs-helper-agreeUpTo .zero zero z≤n = agreeUpTo-reflexive zero (mbs-helper-seq zero)
mbs-helper-agreeUpTo m (suc n) m≤1+n with ≤-suc m≤1+n
... | inj₁ m≤n = agreeUpTo-transitive (mbs-helper-agreeUpTo m n m≤n)
(agreeUpTo-≤ (mbs-helper-agreeUpTo-step n) m≤n)
where
mbs-helper-agreeUpTo-step : (n : ℕ)
→ AgreeUpTo n (mbs-helper-seq n) (mbs-helper-seq (suc n))
mbs-helper-agreeUpTo-step n = proj₂ (MinSeqAt.member (mbs-helper (suc n)))
... | inj₂ refl = agreeUpTo-reflexive (suc n) (mbs-helper-seq (suc n))
mbs : ℕ → A
mbs n = mbs-helper-seq n n
```
In general, the minimal sequence relativized to P need not itself satisfy P.
We need the condition we call "initial segment property" for the mbs to satisfy P.
```agda
module _ (P-isp : InitialSegmentProperty P) where
mbs-member : mbs ∈ P
mbs-member = P-isp mbs (λ (n : ℕ) →
mbs-helper-seq n ,
mbs-helper-member n ,
λ {m : ℕ} (m≤n : m ≤ n) → mbs-helper-agreeUpTo m n m≤n ≤-refl)
```
The predicate "bad" is closed under subsequence, as well as satisfying the initial segment property.
```
module _ {A : Set} (_≼_ : A → A → Set) where
Bad = ¬_ ∘ (Good _≼_)
subseq-bad : {f : ℕ → A} → Bad f → (r : ℕ → ℕ) → Increasing _<_ r → Bad (f ∘ r)
subseq-bad {f} f-bad r r-increasing (i , j , i<j , fri≼frj) =
f-bad (r i , r j , r-increasing i j i<j , fri≼frj)
Bad-isp : InitialSegmentProperty {A} Bad
Bad-isp f h f-good = contra
where
i j : ℕ
i = proj₁ f-good
j = proj₁ (proj₂ f-good)
i<j : i < j
i<j = proj₁ (proj₂ (proj₂ f-good))
fi≼fj : f i ≼ f j
fi≼fj = proj₂ (proj₂ (proj₂ f-good))
g : ℕ → A
g = proj₁ (h j)
g-bad : Bad g
g-bad = proj₁ (proj₂ (h j))
h₁ : AgreeUpTo j f g
h₁ = proj₂ (proj₂ (h j))
fi≡gi : f i ≡ g i
fi≡gi = h₁ (<⇒≤ i<j)
fj≡gj : f j ≡ g j
fj≡gj = h₁ ≤-refl
gi≼gj : g i ≼ g j
gi≼gj rewrite sym fi≡gi | sym fj≡gj = fi≼fj
contra : ⊥
contra = g-bad (i , j , i<j , gi≼gj)
```
We restrict attention to sequences that can be obtained from a subsequence of a given sequence f by
taking a "substructure" of each term in the subsequence.
This predicate satisfies the initial segment property.
```
module _ {A : Set} (_⊑_ : A → A → Set) where
Sub-⊑ : (ℕ → A) → (ℕ → A) → Set
Sub-⊑ f g = Σ[ r ∈ (ℕ → ℕ) ] Increasing _<_ r × ((n : ℕ) → g n ⊑ f (r n) )
Sub-⊑-isp : (f : ℕ → A) → InitialSegmentProperty (Sub-⊑ f)
Sub-⊑-isp f g h = r , r-increasing , r-witness
where
S : ℕ → (ℕ → ℕ) → Set
S n s = Increasing _<_ s × ((m : ℕ) → m ≤ n → g m ⊑ f (s m))
S-nonempty : (n : ℕ) → NonEmpty (S n)
S-nonempty n = s₁ , s₁-increasing , h₃
where
g₁ : ℕ → A
g₁ = proj₁ (h n)
g₁∈Sub-⊑f : g₁ ∈ Sub-⊑ f
g₁∈Sub-⊑f = proj₁ (proj₂ (h n))
s₁ : ℕ → ℕ
s₁ = proj₁ g₁∈Sub-⊑f
s₁-increasing : Increasing _<_ s₁
s₁-increasing = proj₁ (proj₂ g₁∈Sub-⊑f)
h₁ : (m : ℕ) → g₁ m ⊑ f (s₁ m)
h₁ = proj₂ (proj₂ g₁∈Sub-⊑f)
h₂ : AgreeUpTo n g g₁
h₂ = proj₂ (proj₂ (h n))
h₃ : (m : ℕ) → m ≤ n → g m ⊑ f (s₁ m)
h₃ m m≤n rewrite h₂ m≤n = h₁ m
minS : (n : ℕ) → Σ[ s ∈ (ℕ → ℕ) ] (s ∈ S n × ((s′ : ℕ → ℕ) → s′ ∈ S n → s n ≤ s′ n))
minS n = leastSeqAt (S-nonempty n) n
t : ℕ → ℕ → ℕ
t n = proj₁ (minS n)
tn∈Sn : (n : ℕ) → t n ∈ S n
tn∈Sn n = proj₁ (proj₂ (minS n))
tn-increasing : (n : ℕ) → Increasing _<_ (t n)
tn-increasing n = proj₁ (tn∈Sn n)
tn-witness : (n m : ℕ) → m ≤ n → g m ⊑ f (t n m)
tn-witness n = proj₂ (tn∈Sn n)
m<n⇒tn∈Sm : (n m : ℕ) → m < n → t n ∈ S m
m<n⇒tn∈Sm n m m<n = tn-increasing n , λ m₁ m₁≤m → proj₂ (tn∈Sn n) m₁ (≤-trans m₁≤m (<⇒≤ m<n))
r : ℕ → ℕ
r n = t n n
r-increasing : Increasing _<_ r
r-increasing m n m<n = <-transʳ tmm≤tnm tnm<tnn
where
tmm≤tnm : t m m ≤ t n m
tmm≤tnm = proj₂ (proj₂ (minS m)) (t n) (m<n⇒tn∈Sm n m m<n)
tnm<tnn : t n m < t n n
tnm<tnn = tn-increasing n m n m<n
r-witness : (n : ℕ) → g n ⊑ f (r n)
r-witness n = tn-witness n n ≤-refl
Sub-⊑-reflexive : Reflexive _⊑_ → (f : ℕ → A) → f ∈ Sub-⊑ f
Sub-⊑-reflexive ⊑-reflexive f = id , id-increasing , λ n → ⊑-reflexive
Sub-⊑-transitive : Transitive _⊑_ → {f g k : ℕ → A}
→ g ∈ Sub-⊑ f
→ k ∈ Sub-⊑ g
→ k ∈ Sub-⊑ f
Sub-⊑-transitive ⊑-transitive (r₁ , r₁-increasing , h₁) (r₂ , r₂-increasing , h₂) =
r₁ ∘ r₂ ,
subseq-increasing _<_ r₁ r₂ r₁-increasing r₂-increasing ,
λ n → ⊑-transitive (h₂ n) (h₁ (r₂ n))
Sub-⊑-mono : {A : Set} (_⊑₁_ _⊑₂_ : A → A → Set) (f : ℕ → A)
→ ((x y : A) → x ⊑₁ y → x ⊑₂ y)
→ (g : ℕ → A)
→ g ∈ Sub-⊑ _⊑₁_ f
→ g ∈ Sub-⊑ _⊑₂_ f
Sub-⊑-mono _⊑₁_ _⊑₂_ f ⊑₁⇒⊑₂ g (r , r-increasing , h) =
r , r-increasing , λ n → ⊑₁⇒⊑₂ (g n) (f (r n)) (h n)
```
The predicate we use is the conjunction of "bad" and the above predicate.
So, given a bad sequence f, we construct the minimal bad sequence that can be obtained from
a subsequence of f by taking substructures.
```agda
module MBS {A : Set} (μ : A → ℕ) (_≼_ : A → A → Set)
(_⊑_ : A → A → Set) (⊑-reflexive : Reflexive _⊑_)
{f : ℕ → A} (f-bad : ¬ Good _≼_ f) where
Bad-Sub-⊑ : (ℕ → A) → Set
Bad-Sub-⊑ = λ (g : ℕ → A) → ¬ Good _≼_ g × Sub-⊑ _⊑_ f g
Bad-Sub-⊑-nonempty : NonEmpty Bad-Sub-⊑
Bad-Sub-⊑-nonempty = f , f-bad , Sub-⊑-reflexive _⊑_ ⊑-reflexive f
open MBS-helper {A} μ Bad-Sub-⊑ Bad-Sub-⊑-nonempty public
mbs-bad-sub-⊑-member : mbs ∈ Bad-Sub-⊑
mbs-bad-sub-⊑-member = mbs-member (ISP-closed-∩ (¬_ ∘ (Good _≼_)) (Sub-⊑ _⊑_ f)
(Bad-isp _≼_) (Sub-⊑-isp _⊑_ f))
mbs-bad : ¬ Good _≼_ mbs
mbs-bad = proj₁ mbs-bad-sub-⊑-member
mbs-sub-⊑ : mbs ∈ Sub-⊑ _⊑_ f
mbs-sub-⊑ = proj₂ mbs-bad-sub-⊑-member
mbs-bad-sub-⊑-minimal-zero : (g : ℕ → A) → g ∈ Bad-Sub-⊑ → μ (mbs 0) ≤ μ (g 0)
mbs-bad-sub-⊑-minimal-zero = mbs-helper-minimal 0
mbs-bad-sub-⊑-minimal-suc : (n : ℕ) (g : ℕ → A)
→ g ∈ Bad-Sub-⊑ → AgreeUpTo n mbs g → μ (mbs (suc n)) ≤ μ (g (suc n))
mbs-bad-sub-⊑-minimal-suc n g h₁ h₂ = mbs-helper-minimal (suc n) g (h₁ , h)
where
h : AgreeUpTo n (mbs-helper-seq n) g
h {m} m≤n = trans (sym (mbs-helper-agreeUpTo m n m≤n ≤-refl)) (h₂ m≤n)
```
A general form of the minimal bad sequence argument.
If mbs is the minimal bad sequence (with respect to our predicate), then any sequence that can be
obtained by taking a "proper" substructure of each term of a subsequence of mbs must be good, provided
that the binary relation ≼ in question is "monotone" on the right argument with respect to the substructure
relation ⊑.
```
_⊏_ : A → A → Set
x ⊏ y = x ⊑ y × x ≢ y
⊏⇒⊑ : (x y : A) → x ⊏ y → x ⊑ y
⊏⇒⊑ x y (x⊑y , x≢y) = x⊑y
module Sub-⊑-⊏
(⊏-μ-< : {x y : A} → x ⊏ y → μ x < μ y)
(≼-⊑-≼ : {x y z : A} → x ≼ y → y ⊑ z → x ≼ z)
(⊑-transitive : Transitive _⊑_)
where
⊏-transitive : {x y z : A} → x ⊏ y → y ⊏ z → x ⊏ z
⊏-transitive {x} {y} {z} x⊏y@(x⊑y , x≢y) y⊏z@(y⊑z , y≢z) =
⊑-transitive x⊑y y⊑z ,
λ x≡z → <-irrefl (cong μ x≡z) (<-trans (⊏-μ-< x⊏y) (⊏-μ-< y⊏z))
Sub-⊑-⊏-0 : (ℕ → A) → (ℕ → A) → Set
Sub-⊑-⊏-0 k g = Σ[ r ∈ (ℕ → ℕ) ] Increasing _<_ r × ((n : ℕ) → g n ⊑ k (r n)) × g 0 ⊏ k (r 0)
Sub-⊑-⊏-0⇒Sub-⊑ : (k g : ℕ → A) → Sub-⊑-⊏-0 k g → Sub-⊑ _⊑_ k g
Sub-⊑-⊏-0⇒Sub-⊑ k g (r , r-increasing , hn , h0) = r , r-increasing , hn
Sub-⊑-⊏-0-mbs⇒Good : (g : ℕ → A) → g ∈ Sub-⊑-⊏-0 mbs → Good _≼_ g
Sub-⊑-⊏-0-mbs⇒Good g (r , r-increasing , hn , h0) = g-good
where
g∈Sub-⊑ : g ∈ Sub-⊑ _⊑_ mbs
g∈Sub-⊑ = (r , r-increasing , hn)
g-good : Good _≼_ g
g-good with r 0 in eq
... | zero = ¬¬-elim not-g-bad
where
not-g-bad : ¬ ¬ Good _≼_ g
not-g-bad g-bad = ≤⇒≯ h≤ h>
where
h≤ : μ (mbs 0) ≤ μ (g 0)
h≤ = mbs-bad-sub-⊑-minimal-zero g
(g-bad ,
Sub-⊑-transitive _⊑_ ⊑-transitive {f} {mbs} {g}
(proj₂ mbs-bad-sub-⊑-member)
g∈Sub-⊑)
h> : μ (g 0) < μ (mbs 0)
h> = ⊏-μ-< h0
... | suc p = i ∸ (suc p) , j ∸ (suc p) , i∸1+p<j∸1+p , gi∸1+p≼gj∸1+p
where
g′ = switch′ mbs (λ n → g (n ∸ (suc p))) p
g′sucp≡g0 : g′ (suc p) ≡ g 0
g′sucp≡g0 rewrite ≤-<-connex-> (suc p) p (s≤s ≤-refl) | n∸n≡0 (suc p) = refl
r′ = switch′ id (λ n → r (n ∸ (suc p))) p
r′-≤ : (n : ℕ) → n ≤ p → r′ n ≡ n
r′-≤ = switch′-≤ id (λ n → r (n ∸ (suc p))) p
r′-increasing : Increasing _<_ r′
r′-increasing m n m<n with ≤-<-connex m p | ≤-<-connex n p
... | inj₁ m≤p | inj₁ n≤p = m<n
... | inj₁ m≤p | inj₂ n>p =
≤-trans (s≤s m≤p)
(≤-trans (≤-reflexive (sym eq))
(increasing-≤ r r-increasing 0 (n ∸ (suc p)) z≤n))
... | inj₂ m>p | inj₁ n≤p = ⊥-elim (≤⇒≯ (<⇒≤ (<-transʳ n≤p m>p)) m<n)
... | inj₂ m>p | inj₂ n>p =
r-increasing (m ∸ (suc p)) (n ∸ (suc p)) (∸-monoˡ-< m<n m>p)
g′-≤ : (n : ℕ) → n ≤ p → g′ n ≡ mbs n
g′-≤ = switch′-≤ mbs (λ n → g (n ∸ (suc p))) p
g′-> : (n : ℕ) → p < n → g′ n ≡ g (n ∸ (suc p))
g′-> = switch′-> mbs (λ n → g (n ∸ suc p)) p
h₁ : AgreeUpTo p mbs g′
h₁ = agreeUpTo-symmetric p g′ mbs (λ {n : ℕ} → g′-≤ n)
h₂ : (n : ℕ) → g′ n ⊑ mbs (r′ n)
h₂ n with ≤-<-connex n p
... | inj₁ n≤p = ⊑-reflexive
... | inj₂ n>p = hn (n ∸ (suc p))
g′∈Sub-⊑ : g′ ∈ Sub-⊑ _⊑_ mbs
g′∈Sub-⊑ = r′ , r′-increasing , h₂
not-g′-bad : ¬ ¬ Good _≼_ g′
not-g′-bad g′-bad = ≤⇒≯ h≤ h>
where
h≤ : μ (mbs (suc p)) ≤ μ (g′ (suc p))
h≤ = mbs-bad-sub-⊑-minimal-suc p g′
(g′-bad ,
Sub-⊑-transitive _⊑_ ⊑-transitive {f} {mbs} {g′}
(proj₂ mbs-bad-sub-⊑-member) g′∈Sub-⊑)
h₁
h> : μ (g′ (suc p)) < μ (mbs (suc p))
h> rewrite g′sucp≡g0 | eq = ⊏-μ-< h0
g′-good : Good _≼_ g′
g′-good = ¬¬-elim not-g′-bad
i j : ℕ
i = proj₁ g′-good
j = proj₁ (proj₂ g′-good)
i<j : i < j
i<j = proj₁ (proj₂ (proj₂ g′-good))
g′i≼g′j : g′ i ≼ g′ j
g′i≼g′j = proj₂ (proj₂ (proj₂ g′-good))
p<i : p < i
p<i = case-⊎ (λ i≤p → ⊥-elim (¬i≤p i≤p))
(λ i>p → i>p)
(≤-<-connex i p)
where
¬i≤p : i ≤ p → ⊥
¬i≤p i≤p =
mbs-bad (r′ i , r′ j , r′-increasing i j i<j , mbsr′i≼mbsr′j)
where
mbsr′i≼mbsr′j : mbs (r′ i) ≼ mbs (r′ j)
mbsr′i≼mbsr′j = subst (λ z → mbs z ≼ mbs (r′ j)) (sym (r′-≤ i i≤p))
(subst (_≼ mbs (r′ j)) (g′-≤ i i≤p) (≼-⊑-≼ g′i≼g′j (h₂ j)))
p<j : p < j
p<j = <-trans p<i i<j
gi∸1+p≼gj∸1+p : g (i ∸ (suc p)) ≼ g (j ∸ (suc p))
gi∸1+p≼gj∸1+p =
subst (_≼ g (j ∸ (suc p))) (g′-> i p<i) (subst (g′ i ≼_) (g′-> j p<j) g′i≼g′j)
i∸1+p<j∸1+p : i ∸ (suc p) < j ∸ (suc p)
i∸1+p<j∸1+p = ∸-monoˡ-< i<j p<i
Sub-⊏ : (ℕ → A) → (ℕ → A) → Set
Sub-⊏ = Sub-⊑ _⊏_
Sub-⊏⇒Sub-⊑ : (g k : ℕ → A) → k ∈ Sub-⊏ g → k ∈ Sub-⊑ _⊑_ g
Sub-⊏⇒Sub-⊑ g k h = Sub-⊑-mono _⊏_ _⊑_ g ⊏⇒⊑ k h
Sub-⊏⇒Sub-⊑-⊏-0 : (g k : ℕ → A) → k ∈ Sub-⊏ g → k ∈ Sub-⊑-⊏-0 g
Sub-⊏⇒Sub-⊑-⊏-0 g k (r , r-increasing , h) =
r , r-increasing , (λ n → ⊏⇒⊑ (k n) (g (r n)) (h n)) , h 0
Sub-⊏-transitive : {d g k : ℕ → A} → g ∈ Sub-⊏ d → k ∈ Sub-⊏ g → k ∈ Sub-⊏ d
Sub-⊏-transitive {d} {g} {k} = Sub-⊑-transitive _⊏_ ⊏-transitive {d} {g} {k}
Sub-⊏-mbs⇒VeryGood : (g : ℕ → A) → g ∈ Sub-⊏ mbs → VeryGood _≼_ g
Sub-⊏-mbs⇒VeryGood g (s , s-increasing , h) r r-increasing =
Sub-⊑-⊏-0-mbs⇒Good (g ∘ r)
(s ∘ r ,
subseq-increasing _<_ s r s-increasing r-increasing ,
(λ n → ⊏⇒⊑ (g (r n)) (mbs (s (r n))) (h (r n))) ,
h (r 0))
```