|
| 1 | +module facts where |
| 2 | +open import FUSR |
| 3 | +open import Relation.Binary.PropositionalEquality |
| 4 | +open Relation.Binary.PropositionalEquality.≡-Reasoning |
| 5 | +open import Data.Nat |
| 6 | +open import Data.Product |
| 7 | +open import Data.Empty |
| 8 | +open import Data.Fin |
| 9 | +open import Data.Sum |
| 10 | +open import Data.Bool |
| 11 | +import Level |
| 12 | + |
| 13 | +------------------------------------------- |
| 14 | + |
| 15 | +fact : {S T R : Set} → ∀(f : S → Maybe T) → ∀ (g : R → S) → ∀ (s : Maybe R) → rf (f ∘ g) s ≡ (rf f ∘ lrf g) s |
| 16 | +fact f g no = refl |
| 17 | +fact f g (yes x) = refl |
| 18 | + |
| 19 | +fact2 : {n : ℕ} → (t : Term n) → (ι ◃ t ≡ t) |
| 20 | +fact2 (ι x) = refl |
| 21 | +fact2 leaf = refl |
| 22 | +fact2 (s fork t) = cong₂ _fork_ (fact2 s) (fact2 t) |
| 23 | + |
| 24 | +fact3 : {l m n : ℕ} → (f : Fin m → Term n) → (g : Fin l → Term m) → (t : Term l) |
| 25 | + → (f ◇ g) ◃ t ≡ f ◃ (g ◃ t) |
| 26 | +fact3 f g (ι x) = refl |
| 27 | +fact3 f g leaf = refl |
| 28 | +fact3 f g (t fork t₁) = cong₂ _fork_ (fact3 f g t) (fact3 f g t₁) |
| 29 | + |
| 30 | +fact4 : {l m n : ℕ} → (f : Fin m → Term n) → (r : Fin l → Fin m) → ((f ◇ (▹ r)) ≐ (f ∘ r)) |
| 31 | +fact4 = λ f r x → refl |
| 32 | + |
| 33 | +-- suc a ≡ suc b → a ≡ b |
| 34 | +lemma1 : {n : ℕ} → (a b : Fin n) → (_≡_ {_} {Fin (suc n)} (suc a) (suc b)) → a ≡ b |
| 35 | +lemma1 .b b refl = refl |
| 36 | + |
| 37 | +fact5 : {n : ℕ} → (x : Fin (suc n)) → (y : Fin n) → (z : Fin n) → thin x y ≡ thin x z → y ≡ z |
| 38 | +fact5 zero zero zero a = refl |
| 39 | +fact5 zero zero (suc z) () |
| 40 | +fact5 zero (suc y) .(suc y) refl = refl |
| 41 | +fact5 (suc x) zero zero a = refl |
| 42 | +fact5 (suc x) zero (suc z) () |
| 43 | +fact5 (suc x) (suc y) zero () |
| 44 | +fact5 (suc x) (suc y) (suc z) a = cong suc (fact5 x y z (lemma1 (thin x y) (thin x z) a)) |
| 45 | + |
| 46 | +fact6 : {n : ℕ} → (x : Fin (suc n)) → (y : Fin n) → ((thin x y ≡ x) → ⊥) |
| 47 | +fact6 zero zero () |
| 48 | +-- a : suc zero ≡ zero |
| 49 | +fact6 zero (suc y) () |
| 50 | +fact6 (suc x) zero () |
| 51 | +fact6 (suc x) (suc y) a = fact6 x y (lemma1 (thin x y) x a) |
| 52 | + |
| 53 | +fact7 : {n : ℕ} → (x y : Fin (suc n)) → (x ≡ y → ⊥) → Σ[ y' ∈ Fin n ] (thin x y' ≡ y) |
| 54 | +fact7 zero zero a = ⊥-elim (a refl) |
| 55 | +fact7 zero (suc y) a = y , refl |
| 56 | +fact7 {zero} (suc ()) zero a |
| 57 | +fact7 {suc n} (suc x) zero a = zero , refl |
| 58 | +fact7 {zero} (suc ()) (suc y) a |
| 59 | +fact7 {suc n} (suc x) (suc y) a with fact7 x y (λ x₁ → a (cong suc x₁)) |
| 60 | +fact7 {suc n} (suc x) (suc y) a | y' , p = (suc y') , cong suc p |
| 61 | + |
| 62 | +lemma2 : {n : ℕ} → (x : Fin (suc n)) → (y : Fin (suc n)) → (((y ≡ x) × (thick x y) ≡ no) ⊎ (Σ[ y' ∈ Fin n ] y ≡ (thin x y') × ((thick x y) ≡ yes y') )) |
| 63 | +lemma2 zero zero = inj₁ (refl , refl) |
| 64 | +lemma2 zero (suc y) = inj₂ (y , (refl , refl)) |
| 65 | +lemma2 {zero} (suc ()) zero |
| 66 | +lemma2 {suc n} (suc x) zero = inj₂ (zero , (refl , refl)) |
| 67 | +lemma2 {zero} (suc ()) (suc y) |
| 68 | +lemma2 {suc n} (suc x) (suc y) with lemma2 x y |
| 69 | +lemma2 {suc n} (suc x) (suc .x) | inj₁ (refl , thickxx≡no) = inj₁ (refl , cong (λ (a : Maybe (Fin n)) → rf (λ x₁ → yes (suc x₁)) a) thickxx≡no) |
| 70 | +lemma2 {suc n} (suc x) (suc y) | inj₂ (y' , proj₂ , proj₃) = inj₂ (suc y' , (cong suc proj₂ , cong (λ a → rf (λ x₁ → yes (suc x₁)) a) proj₃)) |
| 71 | + |
| 72 | +fact8 : {n : ℕ} → (x : Fin (suc n)) → (y : Fin (suc n)) → (r : Maybe (Fin n)) → (r ≡ thick x y) → (((y ≡ x) × r ≡ no) ⊎ (Σ[ y' ∈ Fin n ] y ≡ (thin x y') × (r ≡ yes y') )) |
| 73 | +fact8 x y .(thick x y) refl = lemma2 x y |
| 74 | + |
| 75 | +fact9 : {n : ℕ} → (t' : Term n) → (x : Fin (suc n)) → ((_for_ t' x) ∘ thin x) ≐ ι |
| 76 | +fact9 {n} t' x y with lemma2 x (thin x y) |
| 77 | +fact9 t' x y | inj₁ (proj₁ , proj₂) with fact6 x y proj₁ |
| 78 | +fact9 t' x y | inj₁ (proj₁ , proj₂) | () |
| 79 | +fact9 t' x y | inj₂ (proj₁ , proj₂ , proj₃) with fact5 x y proj₁ proj₂ |
| 80 | +fact9 t' x .proj₁ | inj₂ (proj₁ , proj₂ , proj₃) | refl rewrite proj₃ = refl |
| 81 | + |
| 82 | +lemma3 : {n : ℕ} → (f : Fin n → Fin (suc n)) → (t : Term n) → (g : Fin (suc n) → Term n) → g ◃ (▹ f ◃ t) ≡ (g ∘ f) ◃ t |
| 83 | +lemma3 f (ι x) g = refl |
| 84 | +lemma3 f leaf g = refl |
| 85 | +lemma3 f (t fork t₁) g = cong₂ (λ x x₁ → x fork x₁) (lemma3 f t g) (lemma3 f t₁ g) |
| 86 | + |
| 87 | +lemma6 : {m n : ℕ} → (f : Fin m → Term n) →(g : Fin m → Term n) → (t' : Term m) → (f ≐ g) → (f ◃ t' ≡ g ◃ t') |
| 88 | +lemma6 f g (ι x) = λ x₁ → x₁ x |
| 89 | +lemma6 f g leaf = λ x → refl |
| 90 | +lemma6 f g (t' fork t'') = λ x → cong₂ (λ x₁ x₂ → x₁ fork x₂) (lemma6 f g t' x) (lemma6 f g t'' x) |
| 91 | + |
| 92 | +--((_for_ t' x) ∘ thin x) ≐ ι |
| 93 | +lemma4 : {n : ℕ} → (t' : Term n) → (x : Fin (suc n)) → ((_for_ t' x) ∘ thin x) ◃ t' ≡ t' |
| 94 | +lemma4 t' x = begin |
| 95 | + ((_for_ t' x) ∘ thin x) ◃ t' |
| 96 | + ≡⟨ lemma6 ((t' for x) ∘ thin x) ι t' (fact9 t' x) ⟩ |
| 97 | + ι ◃ t' |
| 98 | + ≡⟨ fact2 t' ⟩ |
| 99 | + t' |
| 100 | + ∎ |
| 101 | +lemma7 : {n : ℕ} → (x : Fin (suc n)) → ((thick x x) ≡ no) |
| 102 | +lemma7 zero = refl |
| 103 | +lemma7 {zero} (suc ()) |
| 104 | +lemma7 {suc n} (suc x) = cong (rf (λ x₁ → yes (suc x₁))) (lemma7 x) |
| 105 | +--rf (λ x₁ → yes (suc x₁)) (thick x x) ≡ no |
| 106 | + |
| 107 | +lemma5 : {n : ℕ} → (t' : Term n) → (x : Fin (suc n)) → t' ≡ (t' for x) x |
| 108 | +lemma5 t' x rewrite lemma7 x = refl |
| 109 | + |
| 110 | +lemma10 : {A : Set} → {a b : A} → (x y : Maybe A) → ((x ≡ y) × (x ≡ yes a) × (y ≡ yes b)) → (a ≡ b) |
| 111 | +lemma10 no no (refl , () , proj₃) |
| 112 | +lemma10 no (yes x) (proj₁ , () , proj₃) |
| 113 | +lemma10 (yes x) no (proj₁ , proj₂ , ()) |
| 114 | +lemma10 {A} {.b} {b} (yes .b) (yes .b) (refl , refl , refl) = refl |
| 115 | + |
| 116 | +lemma10' : {A : Set} → {a b : A} → ((yes a) ≡ (yes b)) → (a ≡ b) |
| 117 | +lemma10' refl = refl |
| 118 | + |
| 119 | +lemma11 : {A : Set} → {x : A} → (a b : Maybe A) → (f : A → A → A) → ((lrf2 f) a b ≡ yes x) → Σ[ p' ∈ A ] Σ[ q' ∈ A ] ((a ≡ yes p') × (b ≡ yes q')) |
| 120 | +lemma11 no no f () |
| 121 | +lemma11 no (yes x₁) f () |
| 122 | +lemma11 (yes x₁) no f () |
| 123 | +lemma11 (yes p') (yes q') f refl = p' , q' , refl , refl |
| 124 | + |
| 125 | +lemma8 : {n : ℕ} → (x : Fin (suc n)) → (t : Term (suc n)) → (t' : Term n) → (check x t ≡ yes t') → (t ≡ (▹ (thin x) ◃ t')) |
| 126 | +lemma8 x (ι y) t' p with lemma2 x y |
| 127 | +lemma8 x (ι .x) t' p | inj₁ (refl , proj₂) rewrite proj₂ with p |
| 128 | +... | () |
| 129 | +lemma8 x (ι y) t' p | inj₂ (y' , proj₁ , proj₂) rewrite proj₂ with lemma10' p |
| 130 | +... | a rewrite (sym a) | proj₁ = refl |
| 131 | +lemma8 x leaf .leaf refl = refl |
| 132 | +lemma8 x (t fork t₁) t' p with lemma11 (check x t) (check x t₁) (_fork_) p |
| 133 | +lemma8 x (s₁ fork s₂) t' p | s₁' , s₂' , proj₃ , proj₄ |
| 134 | + with lemma8 x s₁ s₁' proj₃ | lemma8 x s₂ s₂' proj₄ |
| 135 | +... | a | b rewrite proj₃ | proj₄ with lemma10' p |
| 136 | +... | c rewrite (sym c) = cong₂ _fork_ a b |
| 137 | + |
| 138 | +fact10 :{n : ℕ} → (x : Fin (suc n)) → (t : Term (suc n)) → (t' : Term n) → (check x t ≡ yes t') → (t' for x) ◃ t ≡ (t' for x) x |
| 139 | +fact10 {n} x t t' p = begin |
| 140 | + (t' for x) ◃ t |
| 141 | + ≡⟨ cong (λ (x₁ : Term (suc n)) → (t' for x) ◃ x₁) (lemma8 x t t' p) ⟩ |
| 142 | + (t' for x) ◃ (▹ (thin x) ◃ t') |
| 143 | + ≡⟨ lemma3 (thin x) t' (t' for x) ⟩ |
| 144 | + ((t' for x) ∘ thin x) ◃ t' |
| 145 | + ≡⟨ lemma4 t' x ⟩ |
| 146 | + t' |
| 147 | + ≡⟨ lemma5 t' x ⟩ |
| 148 | + (t' for x) x |
| 149 | + ∎ |
| 150 | + |
| 151 | +--postulate |
| 152 | +-- ext : {A B : Set} → (f g : (A → B)) → {x : A} → (f x ≡ g x) → (f ≡ g) |
| 153 | +-- thick x p で場合分けすると、証明する式が簡単になる。 |
| 154 | +-- さらに t' で場合分けをすると ext が必要そうだったところが、引数が渡 |
| 155 | +-- される形になって ext なしで証明できるようになる。 |
| 156 | +-- でも、その中で t' に関する再帰が必要になるので、それを別途、相互再帰 |
| 157 | +-- させて証明する。 |
| 158 | + |
| 159 | +mutual |
| 160 | + fact11 : {m n l : ℕ} → (ρ : AList m n) → (σ : AList l m) → (sub (ρ ⊹⊹ σ)) ≐ ((sub ρ) ◇ (sub σ)) |
| 161 | + fact11 ρ anil p = refl |
| 162 | + fact11 ρ (σ asnoc t' / x) p with thick x p |
| 163 | + fact11 ρ (σ asnoc t' / x) p | no = fact11' ρ σ t' |
| 164 | + fact11 ρ (σ asnoc t' / x) p | yes y = fact11 ρ σ y |
| 165 | + |
| 166 | + fact11' : {m n l : ℕ} → (ρ : AList m n) → (σ : AList l m) → (t : Term l) → (sub (ρ ⊹⊹ σ) ◃ t) ≡ sub ρ ◃ (sub σ ◃ t) |
| 167 | + fact11' ρ σ (ι x) = fact11 ρ σ x |
| 168 | + fact11' ρ σ leaf = refl |
| 169 | + fact11' ρ σ (t1 fork t2) = cong₂ _fork_ (fact11' ρ σ t1) (fact11' ρ σ t2) |
0 commit comments