summaryrefslogtreecommitdiff
path: root/src/Problem3.agda
blob: b340df90bb9abb4d6982439954fef3f66864ad65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
{-# OPTIONS --safe #-}

module Problem3 where

open import Data.List
open import Relation.Binary.PropositionalEquality
open import Data.Nat
open import Data.Empty
open import Data.Nat.Properties using (≤-step; n<1+n; <⇒≢; module ≤-Reasoning)

data _⊑_ {A : Set} : List A → List A → Set where
  ⊑-nil  : [] ⊑ []
  ⊑-cons : ∀{x}{xs ys} → xs ⊑ ys → (x ∷ xs) ⊑ (x ∷ ys)
  ⊑-skip : ∀{x}{xs ys} → xs ⊑ ys → xs ⊑ (x ∷ ys)

⊑-refl : ∀{A : Set}(xs : List A) → xs ⊑ xs
⊑-refl []       = ⊑-nil
⊑-refl (x ∷ xs) = ⊑-cons (⊑-refl xs)

-- Induct on the second relation, then the first.
⊑-trans : ∀{A : Set}{xs ys zs : List A} → xs ⊑ ys → ys ⊑ zs → xs ⊑ zs
⊑-trans xs⊑ys          (⊑-skip ys⊑zs) = ⊑-skip (⊑-trans xs⊑ys ys⊑zs)
⊑-trans ⊑-nil          ⊑-nil          = ⊑-nil
⊑-trans (⊑-cons xs⊑ys) (⊑-cons ys⊑zs) = ⊑-cons (⊑-trans xs⊑ys ys⊑zs)
⊑-trans (⊑-skip xs⊑ys) (⊑-cons ys⊑zs) = ⊑-skip (⊑-trans xs⊑ys ys⊑zs)

⊑-len : ∀{A : Set}{xs ys : List A} → xs ⊑ ys → length xs ≤ length ys
⊑-len ⊑-nil          = z≤n
⊑-len (⊑-cons xs⊑ys) = s≤s (⊑-len xs⊑ys)
⊑-len (⊑-skip xs⊑ys) = ≤-step (⊑-len xs⊑ys)

∷-injectiveᵣ : {A : Set} {x y : A} {xs ys : List A} → x ∷ xs ≡ y ∷ ys → xs ≡ ys
∷-injectiveᵣ refl = refl

private
  lemma : {A : Set} {w : A} {xs ys zs ws : List A} → xs ≡ w ∷ ws → xs ⊑ ys → ys ≡ zs → zs ⊑ ws → ⊥
  lemma {w = w} {xs} {ys} {zs} {ws} xs≡w∷ws xs⊑ys ys≡zs zs⊑ws = <⇒≢ prf (cong length (xs≡w∷ws))
    where
    open ≤-Reasoning
    prf : length xs < length (w ∷ ws)
    prf = begin-strict
      length xs       ≤⟨ ⊑-len xs⊑ys ⟩
      length ys       ≡⟨ cong length ys≡zs ⟩
      length zs       ≤⟨ ⊑-len zs⊑ws ⟩
      length ws       <⟨ n<1+n (length ws) ⟩
      length (w ∷ ws) ∎

⊑-antisym-no-K :
  ∀{A : Set}{xs ys zs ws : List A} → xs ⊑ zs → ws ⊑ ys → xs ≡ ys → zs ≡ ws → xs ≡ zs
⊑-antisym-no-K ⊑-nil          ⊑-nil          []≡[]     []≡[]′    = refl
⊑-antisym-no-K (⊑-cons xs⊑zs) (⊑-cons ws⊑ys) x∷xs≡y∷ys x∷zs≡y∷ws = cong (_ ∷_) (⊑-antisym-no-K xs⊑zs ws⊑ys (∷-injectiveᵣ x∷xs≡y∷ys) (∷-injectiveᵣ x∷zs≡y∷ws))
⊑-antisym-no-K (⊑-skip xs⊑zs) ws⊑ys          xs≡ys     z∷zs≡ws   = ⊥-elim (lemma (sym z∷zs≡ws) ws⊑ys (sym xs≡ys) xs⊑zs)
⊑-antisym-no-K xs⊑zs          (⊑-skip ws⊑ys) xs≡y∷ys   zs≡ws     = ⊥-elim (lemma xs≡y∷ys       xs⊑zs zs≡ws       ws⊑ys)

⊑-antisym : ∀{A : Set}{xs ys : List A} → xs ⊑ ys → ys ⊑ xs → xs ≡ ys
⊑-antisym xs⊑ys ys⊑xs = ⊑-antisym-no-K xs⊑ys ys⊑xs refl refl