Mercurial > hg > Members > kono > Proof > HyperReal
changeset 17:02847b697be9
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 08 Jul 2021 08:40:51 +0900 |
parents | cd52a72d4fca |
children | 9fefd6c7fb77 |
files | src/HyperReal.agda src/bijection.agda src/logic.agda src/nat.agda |
diffstat | 4 files changed, 581 insertions(+), 266 deletions(-) [+] |
line wrap: on
line diff
--- a/src/HyperReal.agda Mon Jul 05 11:02:41 2021 +0900 +++ b/src/HyperReal.agda Thu Jul 08 08:40:51 2021 +0900 @@ -7,291 +7,67 @@ open import Level renaming ( suc to succ ; zero to Zero ) open import Relation.Binary.PropositionalEquality hiding ( [_] ) open import Relation.Binary.Definitions -open import Function.Bijection open import Relation.Binary.Structures open import nat open import logic +open import bijection HyperNat : Set HyperNat = ℕ → ℕ -record IsoN : Set where - field - m→ m← : ℕ → ℕ - id→← : (i : ℕ) → m→ (m← i ) ≡ i - id←→ : (i : ℕ) → m← (m→ i ) ≡ i - -open IsoN - -record NxN : Set where - field - nxn→n : ℕ ∧ ℕ → ℕ - n→nxn : ℕ → ℕ ∧ ℕ - nn-id : (i j : ℕ) → n→nxn (nxn→n ⟪ i , j ⟫ ) ≡ ⟪ i , j ⟫ - n-id : (i : ℕ) → nxn→n (n→nxn i ) ≡ i - open _∧_ - -record NN ( i : ℕ) (nxn→n : ℕ → ℕ → ℕ) (n→nxn : ℕ → ℕ ∧ ℕ) : Set where - field - j k sum stage : ℕ - nn : j + k ≡ sum - ni : i ≡ j + stage - k1 : nxn→n j k ≡ i - k0 : n→nxn i ≡ ⟪ j , k ⟫ - nn-unique : {j0 k0 : ℕ } → nxn→n j0 k0 ≡ i → ⟪ j , k ⟫ ≡ ⟪ j0 , k0 ⟫ - -i≤0→i≡0 : {i : ℕ } → i ≤ 0 → i ≡ 0 -i≤0→i≡0 {0} z≤n = refl - - -nxn : NxN -nxn = record { - nxn→n = λ p → nxn→n (proj1 p) (proj2 p) - ; n→nxn = n→nxn - ; nn-id = nn-id - ; n-id = n-id - } where - nxn→n : ℕ → ℕ → ℕ - nxn→n zero zero = zero - nxn→n zero (suc j) = j + suc (nxn→n zero j) - nxn→n (suc i) zero = suc i + suc (nxn→n i zero) - nxn→n (suc i) (suc j) = suc i + suc j + suc (nxn→n i (suc j)) - n→nxn : ℕ → ℕ ∧ ℕ - n→nxn zero = ⟪ 0 , 0 ⟫ - n→nxn (suc i) with n→nxn i - ... | ⟪ x , zero ⟫ = ⟪ zero , suc x ⟫ - ... | ⟪ x , suc y ⟫ = ⟪ suc x , y ⟫ - - nxn→n0 : { j k : ℕ } → nxn→n j k ≡ 0 → ( j ≡ 0 ) ∧ ( k ≡ 0 ) - nxn→n0 {zero} {zero} eq = ⟪ refl , refl ⟫ - nxn→n0 {zero} {(suc k)} eq = ⊥-elim ( nat-≡< (sym eq) (subst (λ k → 0 < k) (+-comm _ k) (s≤s z≤n))) - nxn→n0 {(suc j)} {zero} eq = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) ) - nxn→n0 {(suc j)} {(suc k)} eq = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) ) - - nid20 : (i : ℕ) → i + (nxn→n 0 i) ≡ nxn→n i 0 - nid20 zero = refl -- suc (i + (i + suc (nxn→n 0 i))) ≡ suc (i + suc (nxn→n i 0)) - nid20 (suc i) = begin - suc (i + (i + suc (nxn→n 0 i))) ≡⟨ cong (λ k → suc (i + k)) (sym (+-assoc i 1 (nxn→n 0 i))) ⟩ - suc (i + ((i + 1) + nxn→n 0 i)) ≡⟨ cong (λ k → suc (i + (k + nxn→n 0 i))) (+-comm i 1) ⟩ - suc (i + suc (i + nxn→n 0 i)) ≡⟨ cong ( λ k → suc (i + suc k)) (nid20 i) ⟩ - suc (i + suc (nxn→n i 0)) ∎ where open ≡-Reasoning - - nid4 : {i j : ℕ} → i + 1 + j ≡ i + suc j - nid4 {zero} {j} = refl - nid4 {suc i} {j} = cong suc (nid4 {i} {j} ) - nid5 : {i j k : ℕ} → i + suc (suc j) + suc k ≡ i + suc j + suc (suc k ) - nid5 {zero} {j} {k} = begin - suc (suc j) + suc k ≡⟨ +-assoc 1 (suc j) _ ⟩ - 1 + (suc j + suc k) ≡⟨ +-comm 1 _ ⟩ - (suc j + suc k) + 1 ≡⟨ +-assoc (suc j) (suc k) _ ⟩ - suc j + (suc k + 1) ≡⟨ cong (λ k → suc j + k ) (+-comm (suc k) 1) ⟩ - suc j + suc (suc k) ∎ where open ≡-Reasoning - nid5 {suc i} {j} {k} = cong suc (nid5 {i} {j} {k} ) - - nid2 : (i j : ℕ) → suc (nxn→n i (suc j)) ≡ nxn→n (suc i) j - nid2 zero zero = refl - nid2 zero (suc j) = refl - nid2 (suc i) zero = begin - suc (nxn→n (suc i) 1) ≡⟨ refl ⟩ - suc (suc (i + 1 + suc (nxn→n i 1))) ≡⟨ cong (λ k → suc (suc k)) nid4 ⟩ - suc (suc (i + suc (suc (nxn→n i 1)))) ≡⟨ cong (λ k → suc (suc (i + suc (suc k)))) (nid3 i) ⟩ - suc (suc (i + suc (suc (i + suc (nxn→n i 0))))) ≡⟨ refl ⟩ - nxn→n (suc (suc i)) zero ∎ where - open ≡-Reasoning - nid3 : (i : ℕ) → nxn→n i 1 ≡ i + suc (nxn→n i 0) - nid3 zero = refl - nid3 (suc i) = begin - suc (i + 1 + suc (nxn→n i 1)) ≡⟨ cong suc nid4 ⟩ - suc (i + suc (suc (nxn→n i 1))) ≡⟨ cong (λ k → suc (i + suc (suc k))) (nid3 i) ⟩ - suc (i + suc (suc (i + suc (nxn→n i 0)))) - ∎ - nid2 (suc i) (suc j) = begin - suc (nxn→n (suc i) (suc (suc j))) ≡⟨ refl ⟩ - suc (suc (i + suc (suc j) + suc (nxn→n i (suc (suc j))))) ≡⟨ cong (λ k → suc (suc (i + suc (suc j) + k))) (nid2 i (suc j)) ⟩ - suc (suc (i + suc (suc j) + suc (i + suc j + suc (nxn→n i (suc j))))) ≡⟨ cong ( λ k → suc (suc k)) nid5 ⟩ - suc (suc (i + suc j + suc (suc (i + suc j + suc (nxn→n i (suc j)))))) ≡⟨ refl ⟩ - nxn→n (suc (suc i)) (suc j) ∎ where - open ≡-Reasoning - - nid00 : (i : ℕ) → suc (nxn→n i 0) ≡ nxn→n 0 (suc i) - nid00 zero = refl - nid00 (suc i) = begin - suc (suc (i + suc (nxn→n i 0))) ≡⟨ cong (λ k → suc (suc (i + k ))) (nid00 i) ⟩ - suc (suc (i + (nxn→n 0 (suc i)))) ≡⟨ refl ⟩ - suc (suc (i + (i + suc (nxn→n 0 i)))) ≡⟨ cong suc (sym ( +-assoc 1 i (i + suc (nxn→n 0 i)))) ⟩ - suc ((1 + i) + (i + suc (nxn→n 0 i))) ≡⟨ cong (λ k → suc (k + (i + suc (nxn→n 0 i)))) (+-comm 1 i) ⟩ - suc ((i + 1) + (i + suc (nxn→n 0 i))) ≡⟨ cong suc (+-assoc i 1 (i + suc (nxn→n 0 i))) ⟩ - suc (i + suc (i + suc (nxn→n 0 i))) ∎ where open ≡-Reasoning - - nn : ( i : ℕ) → NN i nxn→n n→nxn - nn zero = record { j = 0 ; k = 0 ; sum = 0 ; stage = 0 ; nn = refl ; ni = refl ; k1 = refl ; k0 = refl - ; nn-unique = λ {j0} {k0} eq → cong₂ (λ x y → ⟪ x , y ⟫) (sym (proj1 (nxn→n0 eq))) (sym (proj2 (nxn→n0 {j0} {k0} eq))) } - nn (suc i) with NN.k (nn i) | inspect NN.k (nn i) - ... | zero | record { eq = eq } = record { k = suc (NN.sum (nn i)) ; j = 0 ; sum = suc (NN.sum (nn i)) ; stage = suc (NN.sum (nn i)) + (NN.stage (nn i)) - ; nn = refl - ; ni = nn01 ; k1 = nn02 ; k0 = nn03 ; nn-unique = nn04 } where - sum = NN.sum (nn i) - stage = NN.stage (nn i) - j = NN.j (nn i) - nn01 : suc i ≡ 0 + (suc sum + stage ) - nn01 = begin - suc i ≡⟨ cong suc (NN.ni (nn i)) ⟩ - suc ((NN.j (nn i) ) + stage ) ≡⟨ cong (λ k → suc (k + stage )) (+-comm 0 _ ) ⟩ - suc ((NN.j (nn i) + 0 ) + stage ) ≡⟨ cong (λ k → suc ((NN.j (nn i) + k) + stage )) (sym eq) ⟩ - suc ((NN.j (nn i) + NN.k (nn i)) + stage ) ≡⟨ cong (λ k → suc ( k + stage )) (NN.nn (nn i)) ⟩ - 0 + (suc sum + stage ) ∎ where open ≡-Reasoning - nn02 : nxn→n 0 (suc sum) ≡ suc i - nn02 = begin - sum + suc (nxn→n 0 sum) ≡⟨ sym (+-assoc sum 1 (nxn→n 0 sum)) ⟩ - (sum + 1) + nxn→n 0 sum ≡⟨ cong (λ k → k + nxn→n 0 sum ) (+-comm sum 1 )⟩ - suc (sum + nxn→n 0 sum) ≡⟨ cong suc (nid20 sum ) ⟩ - suc (nxn→n sum 0) ≡⟨ cong (λ k → suc (nxn→n k 0 )) (sym (NN.nn (nn i))) ⟩ - suc (nxn→n (NN.j (nn i) + (NN.k (nn i)) ) 0) ≡⟨ cong₂ (λ j k → suc (nxn→n (NN.j (nn i) + j) k )) eq (sym eq) ⟩ - suc (nxn→n (NN.j (nn i) + 0 ) (NN.k (nn i))) ≡⟨ cong (λ k → suc ( nxn→n k (NN.k (nn i)))) (+-comm (NN.j (nn i)) 0) ⟩ - suc (nxn→n (NN.j (nn i)) (NN.k (nn i))) ≡⟨ cong suc (NN.k1 (nn i) ) ⟩ - suc i ∎ where open ≡-Reasoning - nn03 : n→nxn (suc i) ≡ ⟪ 0 , suc (NN.sum (nn i)) ⟫ -- k0 : n→nxn i ≡ ⟪ NN.j (nn i) = sum , NN.k (nn i) = 0 ⟫ - nn03 with n→nxn i | inspect n→nxn i - ... | ⟪ x , zero ⟫ | record { eq = eq1 } = begin - ⟪ zero , suc x ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫) (sym (cong proj1 eq1)) ⟩ - ⟪ zero , suc (proj1 (n→nxn i)) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫) (cong proj1 (NN.k0 (nn i))) ⟩ - ⟪ zero , suc (NN.j (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫) (+-comm 0 _ ) ⟩ - ⟪ zero , suc (NN.j (nn i) + 0) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc (NN.j (nn i) + k) ⟫ ) (sym eq) ⟩ - ⟪ zero , suc (NN.j (nn i) + NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫ ) (NN.nn (nn i)) ⟩ - ⟪ 0 , suc sum ⟫ ∎ where open ≡-Reasoning - ... | ⟪ x , suc y ⟫ | record { eq = eq1 } = ⊥-elim ( nat-≡< (sym (cong proj2 (NN.k0 (nn i)))) (begin - suc (NN.k (nn i)) ≡⟨ cong suc eq ⟩ - suc 0 ≤⟨ s≤s z≤n ⟩ - suc y ≡⟨ sym (cong proj2 eq1) ⟩ - proj2 (n→nxn i) ∎ )) where open ≤-Reasoning - -- nid2 : (i j : ℕ) → suc (nxn→n i (suc j)) ≡ nxn→n (suc i) j - nn04 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ 0 , suc (NN.sum (nn i)) ⟫ ≡ ⟪ j0 , k0 ⟫ - nn04 {zero} {suc k0} eq1 = cong (λ k → ⟪ 0 , k ⟫ ) (cong suc (sym nn08)) where -- eq : nxn→n zero (suc k0) ≡ suc i -- - nn07 : nxn→n k0 0 ≡ i - nn07 = cong pred ( begin - suc ( nxn→n k0 0 ) ≡⟨ nid00 k0 ⟩ - nxn→n 0 (suc k0 ) ≡⟨ eq1 ⟩ - suc i ∎ ) where open ≡-Reasoning - nn08 : k0 ≡ sum - nn08 = begin - k0 ≡⟨ cong proj1 (sym (NN.nn-unique (nn i) nn07)) ⟩ - NN.j (nn i) ≡⟨ +-comm 0 _ ⟩ - NN.j (nn i) + 0 ≡⟨ cong (λ k → NN.j (nn i) + k) (sym eq) ⟩ - NN.j (nn i) + NN.k (nn i) ≡⟨ NN.nn (nn i) ⟩ - sum ∎ where open ≡-Reasoning - nn04 {suc j0} {k0} eq1 = ⊥-elim ( nat-≡< (cong proj2 (nn06 nn05)) (subst (λ k → k < suc k0) (sym eq) (s≤s z≤n))) where - nn05 : nxn→n j0 (suc k0) ≡ i - nn05 = begin - nxn→n j0 (suc k0) ≡⟨ cong pred ( begin - suc (nxn→n j0 (suc k0)) ≡⟨ nid2 j0 k0 ⟩ - nxn→n (suc j0) k0 ≡⟨ eq1 ⟩ - suc i ∎ ) ⟩ - i ∎ where open ≡-Reasoning - nn06 : nxn→n j0 (suc k0) ≡ i → ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ j0 , suc k0 ⟫ - nn06 = NN.nn-unique (nn i) - ... | suc k | record {eq = eq} = record { k = k ; j = suc (NN.j (nn i)) ; sum = NN.sum (nn i) ; stage = NN.stage (nn i) ; nn = nn10 - ; ni = cong suc (NN.ni (nn i)) ; k1 = nn11 ; k0 = nn12 ; nn-unique = nn13 } where - nn10 : suc (NN.j (nn i)) + k ≡ NN.sum (nn i) - nn10 = begin - suc (NN.j (nn i)) + k ≡⟨ cong (λ x → x + k) (+-comm 1 _) ⟩ - (NN.j (nn i) + 1) + k ≡⟨ +-assoc (NN.j (nn i)) 1 k ⟩ - NN.j (nn i) + suc k ≡⟨ cong (λ k → NN.j (nn i) + k) (sym eq) ⟩ - NN.j (nn i) + NN.k (nn i) ≡⟨ NN.nn (nn i) ⟩ - NN.sum (nn i) ∎ where open ≡-Reasoning - nn11 : nxn→n (suc (NN.j (nn i))) k ≡ suc i -- nxn→n ( NN.j (nn i)) (NN.k (nn i) ≡ i - nn11 = begin - nxn→n (suc (NN.j (nn i))) k ≡⟨ sym (nid2 (NN.j (nn i)) k) ⟩ - suc (nxn→n (NN.j (nn i)) (suc k)) ≡⟨ cong (λ k → suc (nxn→n (NN.j (nn i)) k)) (sym eq) ⟩ - suc (nxn→n ( NN.j (nn i)) (NN.k (nn i))) ≡⟨ cong suc (NN.k1 (nn i)) ⟩ - suc i ∎ where open ≡-Reasoning - nn18 : zero < NN.k (nn i) - nn18 = subst (λ k → 0 < k ) ( begin - suc k ≡⟨ sym eq ⟩ - NN.k (nn i) ∎ ) (s≤s z≤n ) where open ≡-Reasoning - nn12 : n→nxn (suc i) ≡ ⟪ suc (NN.j (nn i)) , k ⟫ -- n→nxn i ≡ ⟪ NN.j (nn i) , NN.k (nn i) ⟫ - nn12 with n→nxn i | inspect n→nxn i - ... | ⟪ x , zero ⟫ | record { eq = eq1 } = ⊥-elim ( nat-≡< (sym (cong proj2 eq1)) - (subst (λ k → 0 < k ) ( begin - suc k ≡⟨ sym eq ⟩ - NN.k (nn i) ≡⟨ cong proj2 (sym (NN.k0 (nn i)) ) ⟩ - proj2 (n→nxn i) ∎ ) (s≤s z≤n )) ) where open ≡-Reasoning -- eq1 n→nxn i ≡ ⟪ x , zero ⟫ - ... | ⟪ x , suc y ⟫ | record { eq = eq1 } = begin -- n→nxn i ≡ ⟪ x , suc y ⟫ - ⟪ suc x , y ⟫ ≡⟨ refl ⟩ - ⟪ suc x , pred (suc y) ⟫ ≡⟨ cong (λ k → ⟪ suc (proj1 k) , pred (proj2 k) ⟫) ( begin - ⟪ x , suc y ⟫ ≡⟨ sym eq1 ⟩ - n→nxn i ≡⟨ NN.k0 (nn i) ⟩ - ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ∎ ) ⟩ - ⟪ suc (NN.j (nn i)) , pred (NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ suc (NN.j (nn i)) , pred k ⟫) eq ⟩ - ⟪ suc (NN.j (nn i)) , k ⟫ ∎ where open ≡-Reasoning - nn13 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ suc (NN.j (nn i)) , k ⟫ ≡ ⟪ j0 , k0 ⟫ - nn13 {zero} {suc k0} eq1 = ⊥-elim ( nat-≡< (sym (cong proj2 nn17)) nn18 ) where -- (nxn→n zero (suc k0)) ≡ suc i - nn16 : nxn→n k0 zero ≡ i - nn16 = cong pred ( subst (λ k → k ≡ suc i) (sym ( nid00 k0 )) eq1 ) - nn17 : ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ k0 , zero ⟫ - nn17 = NN.nn-unique (nn i) nn16 - nn13 {suc j0} {k0} eq1 = begin - ⟪ suc (NN.j (nn i)) , pred (suc k) ⟫ ≡⟨ cong (λ k → ⟪ suc (NN.j (nn i)) , pred k ⟫ ) (sym eq) ⟩ - ⟪ suc (NN.j (nn i)) , pred (NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ suc (proj1 k) , pred (proj2 k) ⟫) ( begin - ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡⟨ nn15 ⟩ - ⟪ j0 , suc k0 ⟫ ∎ ) ⟩ - ⟪ suc j0 , k0 ⟫ ∎ where -- nxn→n (suc j0) k0 ≡ suc i - open ≡-Reasoning - nn14 : nxn→n j0 (suc k0) ≡ i - nn14 = cong pred ( subst (λ k → k ≡ suc i) (sym ( nid2 j0 k0 )) eq1 ) - nn15 : ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ j0 , suc k0 ⟫ - nn15 = NN.nn-unique (nn i) nn14 - - n-id : (i : ℕ) → nxn→n (proj1 (n→nxn i)) (proj2 (n→nxn i)) ≡ i - n-id i = subst (λ k → nxn→n (proj1 k) (proj2 k) ≡ i ) (sym (NN.k0 (nn i))) (NN.k1 (nn i)) - - nn-id : (j k : ℕ) → n→nxn (nxn→n j k) ≡ ⟪ j , k ⟫ - nn-id j k = begin - n→nxn (nxn→n j k) ≡⟨ NN.k0 (nn (nxn→n j k)) ⟩ - ⟪ NN.j (nn (nxn→n j k)) , NN.k (nn (nxn→n j k)) ⟫ ≡⟨ NN.nn-unique (nn (nxn→n j k)) refl ⟩ - ⟪ j , k ⟫ ∎ where open ≡-Reasoning - - -open NxN +open Bijection n1 : ℕ → ℕ -n1 n = proj1 (n→nxn nxn n) +n1 n = proj1 (fun→ nxn n) n2 : ℕ → ℕ -n2 n = proj2 (n→nxn nxn n) +n2 n = proj2 (fun→ nxn n) _n*_ : (i j : HyperNat ) → HyperNat +i n* j = λ k → i k * j k _n+_ : (i j : HyperNat ) → HyperNat -i n+ j = λ k → i (n1 k) + j (n2 k) - -i n* j = λ k → i (n1 k) * j (n2 k) +i n+ j = λ k → i k + j k hzero : HyperNat hzero _ = 0 +h : (n : ℕ) → HyperNat +h n _ = n + record _n=_ (i j : HyperNat ) : Set where field - =-map : IsoN + =-map : Bijection ℕ ℕ =-m : ℕ - is-n= : (k : ℕ ) → k > =-m → i k ≡ j (m→ =-map k) + is-n= : (k : ℕ ) → k > =-m → i k ≡ j (fun→ =-map k) --- --- +open _n=_ + record _n≤_ (i j : HyperNat ) : Set where field - ≤-map : IsoN + ≤-map : Bijection ℕ ℕ ≤-m : ℕ - is-n≤ : (k : ℕ ) → k > ≤-m → i k ≤ j (m→ ≤-map k) + is-n≤ : (k : ℕ ) → k > ≤-m → i k ≤ j (fun→ ≤-map k) + +open _n≤_ + +_n<_ : (i j : HyperNat ) → Set +i n< j = ( i n+ h 1 ) n≤ j postulate - _cmpn_ : ( i j : HyperNat ) → Dec ( i n≤ j ) + _cmpn_ : ( i j : HyperNat ) → Dec ( i n< j ) + +n=IsEquivalence : IsEquivalence _n=_ +n=IsEquivalence = record { refl = record {=-map = bid ℕ ; =-m = 0 ; is-n= = λ _ _ → refl} + ; sym = λ xy → record {=-map = bi-sym ℕ ℕ (=-map xy) ; =-m = =-m xy ; is-n= = λ k lt → {!!} } -- (is-n= xy k lt) } + ; trans = λ xy yz → record {=-map = bi-trans ℕ ℕ ℕ (=-map xy) (=-map yz) ; =-m = {!!} ; is-n= = λ k lt → {!!} } } HNTotalOrder : IsTotalPreorder _n=_ _n≤_ HNTotalOrder = record { isPreorder = record { - isEquivalence = {!!} - ; reflexive = {!!} + isEquivalence = n=IsEquivalence + ; reflexive = λ eq → record { ≤-map = =-map eq ; ≤-m = =-m eq ; is-n≤ = {!!} } ; trans = {!!} } ; total = {!!} } @@ -300,12 +76,11 @@ data HyperZ : Set where hz : HyperNat → HyperNat → HyperZ -_z*_ : (i j : HyperZ ) → HyperZ _z+_ : (i j : HyperZ ) → HyperZ hz i i₁ z+ hz j j₁ = hz ( i n+ j ) (i₁ n+ j₁ ) --- ( i - i₁ ) * ( j - j₁ ) = i * j + i₁ * j₁ - i * j₁ - i₁ * j +_z*_ : (i j : HyperZ ) → HyperZ hz i i₁ z* hz j j₁ = hz (λ k → i k * j k + i₁ k * j₁ k ) (λ k → i k * j₁ k - i₁ k * j k ) HNzero : HyperNat → Set @@ -317,11 +92,6 @@ _z≤_ : (i j : HyperZ ) → Set _z≤_ = {!!} -≤→= : {i j : ℕ} → i ≤ j → j ≤ i → i ≡ j -≤→= {0} {0} z≤n z≤n = refl -≤→= {suc i} {suc j} (s≤s i<j) (s≤s j<i) = cong suc ( ≤→= {i} {j} i<j j<i ) - - HNzero? : ( i : HyperNat ) → Dec (HNzero i) HNzero? i with i cmpn hzero | hzero cmpn i @@ -340,10 +110,6 @@ import Axiom.Extensionality.Propositional postulate f-extensionality : { n m : Level} → Axiom.Extensionality.Propositional.Extensionality n m -m*n=0⇒m=0∨n=0 : {i j : ℕ} → i * j ≡ 0 → (i ≡ 0) ∨ ( j ≡ 0 ) -m*n=0⇒m=0∨n=0 {zero} {j} refl = case1 refl -m*n=0⇒m=0∨n=0 {suc i} {zero} eq = case2 refl - HNnzero* : {x y : HyperNat } → ¬ ( HNzero x ) → ¬ ( HNzero y ) → ¬ ( HNzero (x n* y) ) HNnzero* {x} {y} nzx nzy nzx*y with HNnzerok x nzx | HNnzerok y nzy ... | s | t = {!!} where
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/bijection.agda Thu Jul 08 08:40:51 2021 +0900 @@ -0,0 +1,512 @@ +module bijection where + +open import Level renaming ( zero to Zero ; suc to Suc ) +open import Data.Nat +open import Data.Maybe +open import Data.List hiding ([_] ; sum ) +open import Data.Nat.Properties +open import Relation.Nullary +open import Data.Empty +open import Data.Unit hiding ( _≤_ ) +open import Relation.Binary.Core hiding (_⇔_) +open import Relation.Binary.Definitions +open import Relation.Binary.PropositionalEquality + +open import logic +open import nat + +-- record Bijection {n m : Level} (R : Set n) (S : Set m) : Set (n Level.⊔ m) where +-- field +-- fun← : S → R +-- fun→ : R → S +-- fiso← : (x : R) → fun← ( fun→ x ) ≡ x +-- fiso→ : (x : S ) → fun→ ( fun← x ) ≡ x +-- +-- injection : {n m : Level} (R : Set n) (S : Set m) (f : R → S ) → Set (n Level.⊔ m) +-- injection R S f = (x y : R) → f x ≡ f y → x ≡ y + +open Bijection + +bi-trans : {n m l : Level} (R : Set n) (S : Set m) (T : Set l) → Bijection R S → Bijection S T → Bijection R T +bi-trans R S T rs st = record { fun← = λ x → fun← rs ( fun← st x ) ; fun→ = λ x → fun→ st ( fun→ rs x ) + ; fiso← = λ x → trans (cong (λ k → fun← rs k) (fiso← st (fun→ rs x))) ( fiso← rs x) + ; fiso→ = λ x → trans (cong (λ k → fun→ st k) (fiso→ rs (fun← st x))) ( fiso→ st x) } + +bid : {n : Level} (R : Set n) → Bijection R R +bid {n} R = record { fun← = λ x → x ; fun→ = λ x → x ; fiso← = λ _ → refl ; fiso→ = λ _ → refl } + +bi-sym : {n m : Level} (R : Set n) (S : Set m) → Bijection R S → Bijection S R +bi-sym R S eq = record { fun← = fun→ eq ; fun→ = fun← eq ; fiso← = fiso→ eq ; fiso→ = fiso← eq } + +open import Relation.Binary.Structures + +bijIsEquivalence : {n : Level } → IsEquivalence (Bijection {n} {n}) +bijIsEquivalence = record { refl = λ {R} → bid R ; sym = λ {R} {S} → bi-sym R S ; trans = λ {R} {S} {T} → bi-trans R S T } + +-- ¬ A = A → ⊥ +-- +-- famous diagnostic function +-- + +diag : {S : Set } (b : Bijection ( S → Bool ) S) → S → Bool +diag b n = not (fun← b n n) + +diagonal : { S : Set } → ¬ Bijection ( S → Bool ) S +diagonal {S} b = diagn1 (fun→ b (λ n → diag b n) ) refl where + diagn1 : (n : S ) → ¬ (fun→ b (λ n → diag b n) ≡ n ) + diagn1 n dn = ¬t=f (diag b n ) ( begin + not (diag b n) + ≡⟨⟩ + not (not fun← b n n) + ≡⟨ cong (λ k → not (k n) ) (sym (fiso← b _)) ⟩ + not (fun← b (fun→ b (diag b)) n) + ≡⟨ cong (λ k → not (fun← b k n) ) dn ⟩ + not (fun← b n n) + ≡⟨⟩ + diag b n + ∎ ) where open ≡-Reasoning + +b1 : (b : Bijection ( ℕ → Bool ) ℕ) → ℕ +b1 b = fun→ b (diag b) + +b-iso : (b : Bijection ( ℕ → Bool ) ℕ) → fun← b (b1 b) ≡ (diag b) +b-iso b = fiso← b _ + +-- +-- ℕ <=> ℕ + 1 +-- +to1 : {n : Level} {R : Set n} → Bijection ℕ R → Bijection ℕ (⊤ ∨ R ) +to1 {n} {R} b = record { + fun← = to11 + ; fun→ = to12 + ; fiso← = to13 + ; fiso→ = to14 + } where + to11 : ⊤ ∨ R → ℕ + to11 (case1 tt) = 0 + to11 (case2 x) = suc ( fun← b x ) + to12 : ℕ → ⊤ ∨ R + to12 zero = case1 tt + to12 (suc n) = case2 ( fun→ b n) + to13 : (x : ℕ) → to11 (to12 x) ≡ x + to13 zero = refl + to13 (suc x) = cong suc (fiso← b x) + to14 : (x : ⊤ ∨ R) → to12 (to11 x) ≡ x + to14 (case1 x) = refl + to14 (case2 x) = cong case2 (fiso→ b x) + + +open _∧_ + +record NN ( i : ℕ) (nxn→n : ℕ → ℕ → ℕ) (n→nxn : ℕ → ℕ ∧ ℕ) : Set where + field + j k sum stage : ℕ + nn : j + k ≡ sum + ni : i ≡ j + stage -- not used + k1 : nxn→n j k ≡ i + k0 : n→nxn i ≡ ⟪ j , k ⟫ + nn-unique : {j0 k0 : ℕ } → nxn→n j0 k0 ≡ i → ⟪ j , k ⟫ ≡ ⟪ j0 , k0 ⟫ + +i≤0→i≡0 : {i : ℕ } → i ≤ 0 → i ≡ 0 +i≤0→i≡0 {0} z≤n = refl + + +nxn : Bijection ℕ (ℕ ∧ ℕ) +nxn = record { + fun← = λ p → nxn→n (proj1 p) (proj2 p) + ; fun→ = n→nxn + ; fiso← = n-id + ; fiso→ = λ x → nn-id (proj1 x) (proj2 x) + } where + nxn→n : ℕ → ℕ → ℕ + nxn→n zero zero = zero + nxn→n zero (suc j) = j + suc (nxn→n zero j) + nxn→n (suc i) zero = suc i + suc (nxn→n i zero) + nxn→n (suc i) (suc j) = suc i + suc j + suc (nxn→n i (suc j)) + n→nxn : ℕ → ℕ ∧ ℕ + n→nxn zero = ⟪ 0 , 0 ⟫ + n→nxn (suc i) with n→nxn i + ... | ⟪ x , zero ⟫ = ⟪ zero , suc x ⟫ + ... | ⟪ x , suc y ⟫ = ⟪ suc x , y ⟫ + + nxn→n0 : { j k : ℕ } → nxn→n j k ≡ 0 → ( j ≡ 0 ) ∧ ( k ≡ 0 ) + nxn→n0 {zero} {zero} eq = ⟪ refl , refl ⟫ + nxn→n0 {zero} {(suc k)} eq = ⊥-elim ( nat-≡< (sym eq) (subst (λ k → 0 < k) (+-comm _ k) (s≤s z≤n))) + nxn→n0 {(suc j)} {zero} eq = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) ) + nxn→n0 {(suc j)} {(suc k)} eq = ⊥-elim ( nat-≡< (sym eq) (s≤s z≤n) ) + + nid20 : (i : ℕ) → i + (nxn→n 0 i) ≡ nxn→n i 0 + nid20 zero = refl -- suc (i + (i + suc (nxn→n 0 i))) ≡ suc (i + suc (nxn→n i 0)) + nid20 (suc i) = begin + suc (i + (i + suc (nxn→n 0 i))) ≡⟨ cong (λ k → suc (i + k)) (sym (+-assoc i 1 (nxn→n 0 i))) ⟩ + suc (i + ((i + 1) + nxn→n 0 i)) ≡⟨ cong (λ k → suc (i + (k + nxn→n 0 i))) (+-comm i 1) ⟩ + suc (i + suc (i + nxn→n 0 i)) ≡⟨ cong ( λ k → suc (i + suc k)) (nid20 i) ⟩ + suc (i + suc (nxn→n i 0)) ∎ where open ≡-Reasoning + + nid4 : {i j : ℕ} → i + 1 + j ≡ i + suc j + nid4 {zero} {j} = refl + nid4 {suc i} {j} = cong suc (nid4 {i} {j} ) + nid5 : {i j k : ℕ} → i + suc (suc j) + suc k ≡ i + suc j + suc (suc k ) + nid5 {zero} {j} {k} = begin + suc (suc j) + suc k ≡⟨ +-assoc 1 (suc j) _ ⟩ + 1 + (suc j + suc k) ≡⟨ +-comm 1 _ ⟩ + (suc j + suc k) + 1 ≡⟨ +-assoc (suc j) (suc k) _ ⟩ + suc j + (suc k + 1) ≡⟨ cong (λ k → suc j + k ) (+-comm (suc k) 1) ⟩ + suc j + suc (suc k) ∎ where open ≡-Reasoning + nid5 {suc i} {j} {k} = cong suc (nid5 {i} {j} {k} ) + + -- increment in ths same stage + nid2 : (i j : ℕ) → suc (nxn→n i (suc j)) ≡ nxn→n (suc i) j + nid2 zero zero = refl + nid2 zero (suc j) = refl + nid2 (suc i) zero = begin + suc (nxn→n (suc i) 1) ≡⟨ refl ⟩ + suc (suc (i + 1 + suc (nxn→n i 1))) ≡⟨ cong (λ k → suc (suc k)) nid4 ⟩ + suc (suc (i + suc (suc (nxn→n i 1)))) ≡⟨ cong (λ k → suc (suc (i + suc (suc k)))) (nid3 i) ⟩ + suc (suc (i + suc (suc (i + suc (nxn→n i 0))))) ≡⟨ refl ⟩ + nxn→n (suc (suc i)) zero ∎ where + open ≡-Reasoning + nid3 : (i : ℕ) → nxn→n i 1 ≡ i + suc (nxn→n i 0) + nid3 zero = refl + nid3 (suc i) = begin + suc (i + 1 + suc (nxn→n i 1)) ≡⟨ cong suc nid4 ⟩ + suc (i + suc (suc (nxn→n i 1))) ≡⟨ cong (λ k → suc (i + suc (suc k))) (nid3 i) ⟩ + suc (i + suc (suc (i + suc (nxn→n i 0)))) ∎ + nid2 (suc i) (suc j) = begin + suc (nxn→n (suc i) (suc (suc j))) ≡⟨ refl ⟩ + suc (suc (i + suc (suc j) + suc (nxn→n i (suc (suc j))))) ≡⟨ cong (λ k → suc (suc (i + suc (suc j) + k))) (nid2 i (suc j)) ⟩ + suc (suc (i + suc (suc j) + suc (i + suc j + suc (nxn→n i (suc j))))) ≡⟨ cong ( λ k → suc (suc k)) nid5 ⟩ + suc (suc (i + suc j + suc (suc (i + suc j + suc (nxn→n i (suc j)))))) ≡⟨ refl ⟩ + nxn→n (suc (suc i)) (suc j) ∎ where + open ≡-Reasoning + + -- increment ths stage + nid00 : (i : ℕ) → suc (nxn→n i 0) ≡ nxn→n 0 (suc i) + nid00 zero = refl + nid00 (suc i) = begin + suc (suc (i + suc (nxn→n i 0))) ≡⟨ cong (λ k → suc (suc (i + k ))) (nid00 i) ⟩ + suc (suc (i + (nxn→n 0 (suc i)))) ≡⟨ refl ⟩ + suc (suc (i + (i + suc (nxn→n 0 i)))) ≡⟨ cong suc (sym ( +-assoc 1 i (i + suc (nxn→n 0 i)))) ⟩ + suc ((1 + i) + (i + suc (nxn→n 0 i))) ≡⟨ cong (λ k → suc (k + (i + suc (nxn→n 0 i)))) (+-comm 1 i) ⟩ + suc ((i + 1) + (i + suc (nxn→n 0 i))) ≡⟨ cong suc (+-assoc i 1 (i + suc (nxn→n 0 i))) ⟩ + suc (i + suc (i + suc (nxn→n 0 i))) ∎ where open ≡-Reasoning + + ----- + -- + -- create the invariant NN for all n + -- + nn : ( i : ℕ) → NN i nxn→n n→nxn + nn zero = record { j = 0 ; k = 0 ; sum = 0 ; stage = 0 ; nn = refl ; ni = refl ; k1 = refl ; k0 = refl + ; nn-unique = λ {j0} {k0} eq → cong₂ (λ x y → ⟪ x , y ⟫) (sym (proj1 (nxn→n0 eq))) (sym (proj2 (nxn→n0 {j0} {k0} eq))) } + nn (suc i) with NN.k (nn i) | inspect NN.k (nn i) + ... | zero | record { eq = eq } = record { k = suc (NN.sum (nn i)) ; j = 0 ; sum = suc (NN.sum (nn i)) ; stage = suc (NN.sum (nn i)) + (NN.stage (nn i)) + ; nn = refl + ; ni = nn01 ; k1 = nn02 ; k0 = nn03 ; nn-unique = nn04 } where + --- + --- increment the stage + --- + sum = NN.sum (nn i) + stage = NN.stage (nn i) + j = NN.j (nn i) + nn01 : suc i ≡ 0 + (suc sum + stage ) + nn01 = begin + suc i ≡⟨ cong suc (NN.ni (nn i)) ⟩ + suc ((NN.j (nn i) ) + stage ) ≡⟨ cong (λ k → suc (k + stage )) (+-comm 0 _ ) ⟩ + suc ((NN.j (nn i) + 0 ) + stage ) ≡⟨ cong (λ k → suc ((NN.j (nn i) + k) + stage )) (sym eq) ⟩ + suc ((NN.j (nn i) + NN.k (nn i)) + stage ) ≡⟨ cong (λ k → suc ( k + stage )) (NN.nn (nn i)) ⟩ + 0 + (suc sum + stage ) ∎ where open ≡-Reasoning + nn02 : nxn→n 0 (suc sum) ≡ suc i + nn02 = begin + sum + suc (nxn→n 0 sum) ≡⟨ sym (+-assoc sum 1 (nxn→n 0 sum)) ⟩ + (sum + 1) + nxn→n 0 sum ≡⟨ cong (λ k → k + nxn→n 0 sum ) (+-comm sum 1 )⟩ + suc (sum + nxn→n 0 sum) ≡⟨ cong suc (nid20 sum ) ⟩ + suc (nxn→n sum 0) ≡⟨ cong (λ k → suc (nxn→n k 0 )) (sym (NN.nn (nn i))) ⟩ + suc (nxn→n (NN.j (nn i) + (NN.k (nn i)) ) 0) ≡⟨ cong₂ (λ j k → suc (nxn→n (NN.j (nn i) + j) k )) eq (sym eq) ⟩ + suc (nxn→n (NN.j (nn i) + 0 ) (NN.k (nn i))) ≡⟨ cong (λ k → suc ( nxn→n k (NN.k (nn i)))) (+-comm (NN.j (nn i)) 0) ⟩ + suc (nxn→n (NN.j (nn i)) (NN.k (nn i))) ≡⟨ cong suc (NN.k1 (nn i) ) ⟩ + suc i ∎ where open ≡-Reasoning + nn03 : n→nxn (suc i) ≡ ⟪ 0 , suc (NN.sum (nn i)) ⟫ -- k0 : n→nxn i ≡ ⟪ NN.j (nn i) = sum , NN.k (nn i) = 0 ⟫ + nn03 with n→nxn i | inspect n→nxn i + ... | ⟪ x , zero ⟫ | record { eq = eq1 } = begin + ⟪ zero , suc x ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫) (sym (cong proj1 eq1)) ⟩ + ⟪ zero , suc (proj1 (n→nxn i)) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫) (cong proj1 (NN.k0 (nn i))) ⟩ + ⟪ zero , suc (NN.j (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫) (+-comm 0 _ ) ⟩ + ⟪ zero , suc (NN.j (nn i) + 0) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc (NN.j (nn i) + k) ⟫ ) (sym eq) ⟩ + ⟪ zero , suc (NN.j (nn i) + NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ zero , suc k ⟫ ) (NN.nn (nn i)) ⟩ + ⟪ 0 , suc sum ⟫ ∎ where open ≡-Reasoning + ... | ⟪ x , suc y ⟫ | record { eq = eq1 } = ⊥-elim ( nat-≡< (sym (cong proj2 (NN.k0 (nn i)))) (begin + suc (NN.k (nn i)) ≡⟨ cong suc eq ⟩ + suc 0 ≤⟨ s≤s z≤n ⟩ + suc y ≡⟨ sym (cong proj2 eq1) ⟩ + proj2 (n→nxn i) ∎ )) where open ≤-Reasoning + -- nid2 : (i j : ℕ) → suc (nxn→n i (suc j)) ≡ nxn→n (suc i) j + nn04 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ 0 , suc (NN.sum (nn i)) ⟫ ≡ ⟪ j0 , k0 ⟫ + nn04 {zero} {suc k0} eq1 = cong (λ k → ⟪ 0 , k ⟫ ) (cong suc (sym nn08)) where -- eq : nxn→n zero (suc k0) ≡ suc i -- + nn07 : nxn→n k0 0 ≡ i + nn07 = cong pred ( begin + suc ( nxn→n k0 0 ) ≡⟨ nid00 k0 ⟩ + nxn→n 0 (suc k0 ) ≡⟨ eq1 ⟩ + suc i ∎ ) where open ≡-Reasoning + nn08 : k0 ≡ sum + nn08 = begin + k0 ≡⟨ cong proj1 (sym (NN.nn-unique (nn i) nn07)) ⟩ + NN.j (nn i) ≡⟨ +-comm 0 _ ⟩ + NN.j (nn i) + 0 ≡⟨ cong (λ k → NN.j (nn i) + k) (sym eq) ⟩ + NN.j (nn i) + NN.k (nn i) ≡⟨ NN.nn (nn i) ⟩ + sum ∎ where open ≡-Reasoning + nn04 {suc j0} {k0} eq1 = ⊥-elim ( nat-≡< (cong proj2 (nn06 nn05)) (subst (λ k → k < suc k0) (sym eq) (s≤s z≤n))) where + nn05 : nxn→n j0 (suc k0) ≡ i + nn05 = begin + nxn→n j0 (suc k0) ≡⟨ cong pred ( begin + suc (nxn→n j0 (suc k0)) ≡⟨ nid2 j0 k0 ⟩ + nxn→n (suc j0) k0 ≡⟨ eq1 ⟩ + suc i ∎ ) ⟩ + i ∎ where open ≡-Reasoning + nn06 : nxn→n j0 (suc k0) ≡ i → ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ j0 , suc k0 ⟫ + nn06 = NN.nn-unique (nn i) + ... | suc k | record {eq = eq} = record { k = k ; j = suc (NN.j (nn i)) ; sum = NN.sum (nn i) ; stage = NN.stage (nn i) ; nn = nn10 + ; ni = cong suc (NN.ni (nn i)) ; k1 = nn11 ; k0 = nn12 ; nn-unique = nn13 } where + --- + --- increment in a stage + --- + nn10 : suc (NN.j (nn i)) + k ≡ NN.sum (nn i) + nn10 = begin + suc (NN.j (nn i)) + k ≡⟨ cong (λ x → x + k) (+-comm 1 _) ⟩ + (NN.j (nn i) + 1) + k ≡⟨ +-assoc (NN.j (nn i)) 1 k ⟩ + NN.j (nn i) + suc k ≡⟨ cong (λ k → NN.j (nn i) + k) (sym eq) ⟩ + NN.j (nn i) + NN.k (nn i) ≡⟨ NN.nn (nn i) ⟩ + NN.sum (nn i) ∎ where open ≡-Reasoning + nn11 : nxn→n (suc (NN.j (nn i))) k ≡ suc i -- nxn→n ( NN.j (nn i)) (NN.k (nn i) ≡ i + nn11 = begin + nxn→n (suc (NN.j (nn i))) k ≡⟨ sym (nid2 (NN.j (nn i)) k) ⟩ + suc (nxn→n (NN.j (nn i)) (suc k)) ≡⟨ cong (λ k → suc (nxn→n (NN.j (nn i)) k)) (sym eq) ⟩ + suc (nxn→n ( NN.j (nn i)) (NN.k (nn i))) ≡⟨ cong suc (NN.k1 (nn i)) ⟩ + suc i ∎ where open ≡-Reasoning + nn18 : zero < NN.k (nn i) + nn18 = subst (λ k → 0 < k ) ( begin + suc k ≡⟨ sym eq ⟩ + NN.k (nn i) ∎ ) (s≤s z≤n ) where open ≡-Reasoning + nn12 : n→nxn (suc i) ≡ ⟪ suc (NN.j (nn i)) , k ⟫ -- n→nxn i ≡ ⟪ NN.j (nn i) , NN.k (nn i) ⟫ + nn12 with n→nxn i | inspect n→nxn i + ... | ⟪ x , zero ⟫ | record { eq = eq1 } = ⊥-elim ( nat-≡< (sym (cong proj2 eq1)) + (subst (λ k → 0 < k ) ( begin + suc k ≡⟨ sym eq ⟩ + NN.k (nn i) ≡⟨ cong proj2 (sym (NN.k0 (nn i)) ) ⟩ + proj2 (n→nxn i) ∎ ) (s≤s z≤n )) ) where open ≡-Reasoning -- eq1 n→nxn i ≡ ⟪ x , zero ⟫ + ... | ⟪ x , suc y ⟫ | record { eq = eq1 } = begin -- n→nxn i ≡ ⟪ x , suc y ⟫ + ⟪ suc x , y ⟫ ≡⟨ refl ⟩ + ⟪ suc x , pred (suc y) ⟫ ≡⟨ cong (λ k → ⟪ suc (proj1 k) , pred (proj2 k) ⟫) ( begin + ⟪ x , suc y ⟫ ≡⟨ sym eq1 ⟩ + n→nxn i ≡⟨ NN.k0 (nn i) ⟩ + ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ∎ ) ⟩ + ⟪ suc (NN.j (nn i)) , pred (NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ suc (NN.j (nn i)) , pred k ⟫) eq ⟩ + ⟪ suc (NN.j (nn i)) , k ⟫ ∎ where open ≡-Reasoning + nn13 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ suc (NN.j (nn i)) , k ⟫ ≡ ⟪ j0 , k0 ⟫ + nn13 {zero} {suc k0} eq1 = ⊥-elim ( nat-≡< (sym (cong proj2 nn17)) nn18 ) where -- (nxn→n zero (suc k0)) ≡ suc i + nn16 : nxn→n k0 zero ≡ i + nn16 = cong pred ( subst (λ k → k ≡ suc i) (sym ( nid00 k0 )) eq1 ) + nn17 : ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ k0 , zero ⟫ + nn17 = NN.nn-unique (nn i) nn16 + nn13 {suc j0} {k0} eq1 = begin + ⟪ suc (NN.j (nn i)) , pred (suc k) ⟫ ≡⟨ cong (λ k → ⟪ suc (NN.j (nn i)) , pred k ⟫ ) (sym eq) ⟩ + ⟪ suc (NN.j (nn i)) , pred (NN.k (nn i)) ⟫ ≡⟨ cong (λ k → ⟪ suc (proj1 k) , pred (proj2 k) ⟫) ( begin + ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡⟨ nn15 ⟩ + ⟪ j0 , suc k0 ⟫ ∎ ) ⟩ + ⟪ suc j0 , k0 ⟫ ∎ where -- nxn→n (suc j0) k0 ≡ suc i + open ≡-Reasoning + nn14 : nxn→n j0 (suc k0) ≡ i + nn14 = cong pred ( subst (λ k → k ≡ suc i) (sym ( nid2 j0 k0 )) eq1 ) + nn15 : ⟪ NN.j (nn i) , NN.k (nn i) ⟫ ≡ ⟪ j0 , suc k0 ⟫ + nn15 = NN.nn-unique (nn i) nn14 + + n-id : (i : ℕ) → nxn→n (proj1 (n→nxn i)) (proj2 (n→nxn i)) ≡ i + n-id i = subst (λ k → nxn→n (proj1 k) (proj2 k) ≡ i ) (sym (NN.k0 (nn i))) (NN.k1 (nn i)) + + nn-id : (j k : ℕ) → n→nxn (nxn→n j k) ≡ ⟪ j , k ⟫ + nn-id j k = begin + n→nxn (nxn→n j k) ≡⟨ NN.k0 (nn (nxn→n j k)) ⟩ + ⟪ NN.j (nn (nxn→n j k)) , NN.k (nn (nxn→n j k)) ⟫ ≡⟨ NN.nn-unique (nn (nxn→n j k)) refl ⟩ + ⟪ j , k ⟫ ∎ where open ≡-Reasoning + + +-- [] 0 +-- 0 → 1 +-- 1 → 2 +-- 01 → 3 +-- 11 → 4 +-- ... + +-- +-- binary invariant +-- +record LB (n : ℕ) (lton : List Bool → ℕ ) : Set where + field + nlist : List Bool + isBin : lton nlist ≡ n + isUnique : (x : List Bool) → lton x ≡ n → nlist ≡ x -- we don't need this + +lb+1 : List Bool → List Bool +lb+1 [] = false ∷ [] +lb+1 (false ∷ t) = true ∷ t +lb+1 (true ∷ t) = false ∷ lb+1 t + +lb-1 : List Bool → List Bool +lb-1 [] = [] +lb-1 (true ∷ t) = false ∷ t +lb-1 (false ∷ t) with lb-1 t +... | [] = true ∷ [] +... | x ∷ t1 = true ∷ x ∷ t1 + +LBℕ : Bijection ℕ ( List Bool ) +LBℕ = record { + fun← = λ x → lton x + ; fun→ = λ n → LB.nlist (lb n) + ; fiso← = λ n → LB.isBin (lb n) + ; fiso→ = λ x → LB.isUnique (lb (lton x)) x refl + } where + lton1 : List Bool → ℕ + lton1 [] = 1 + lton1 (true ∷ t) = suc (lton1 t + lton1 t) + lton1 (false ∷ t) = lton1 t + lton1 t + lton : List Bool → ℕ + lton x = pred (lton1 x) + + lton1>0 : (x : List Bool ) → 0 < lton1 x + lton1>0 [] = a<sa + lton1>0 (true ∷ x₁) = 0<s + lton1>0 (false ∷ t) = ≤-trans (lton1>0 t) x≤x+y + + 2lton1>0 : (t : List Bool ) → 0 < lton1 t + lton1 t + 2lton1>0 t = ≤-trans (lton1>0 t) x≤x+y + + lb=3 : {x y : ℕ} → 0 < x → 0 < y → 1 ≤ pred (x + y) + lb=3 {suc x} {suc y} (s≤s 0<x) (s≤s 0<y) = subst (λ k → 1 ≤ k ) (+-comm (suc y) _ ) (s≤s z≤n) + + lton-cons>0 : {x : Bool} {y : List Bool } → 0 < lton (x ∷ y) + lton-cons>0 {true} {[]} = refl-≤s + lton-cons>0 {true} {x ∷ y} = ≤-trans ( lb=3 (lton1>0 (x ∷ y)) (lton1>0 (x ∷ y))) px≤x + lton-cons>0 {false} {[]} = refl-≤ + lton-cons>0 {false} {x ∷ y} = lb=3 (lton1>0 (x ∷ y)) (lton1>0 (x ∷ y)) + + lb=0 : {x y : ℕ } → pred x < pred y → suc (x + x ∸ 1) < suc (y + y ∸ 1) + lb=0 {0} {suc y} lt = s≤s (subst (λ k → 0 < k ) (+-comm (suc y) y ) 0<s) + lb=0 {suc x} {suc y} lt = begin + suc (suc ((suc x + suc x) ∸ 1)) ≡⟨ refl ⟩ + suc (suc x) + suc x ≡⟨ refl ⟩ + suc (suc x + suc x) ≤⟨ <-plus (s≤s lt) ⟩ + suc y + suc x <⟨ <-plus-0 {suc x} {suc y} {suc y} (s≤s lt) ⟩ + suc y + suc y ≡⟨ refl ⟩ + suc ((suc y + suc y) ∸ 1) ∎ where open ≤-Reasoning + lb=2 : {x y : ℕ } → pred x < pred y → suc (x + x ) < suc (y + y ) + lb=2 {zero} {suc y} lt = s≤s 0<s + lb=2 {suc x} {suc y} lt = s≤s (lb=0 {suc x} {suc y} lt) + lb=1 : {x y : List Bool} {z : Bool} → lton (z ∷ x) ≡ lton (z ∷ y) → lton x ≡ lton y + lb=1 {x} {y} {true} eq with <-cmp (lton x) (lton y) + ... | tri< a ¬b ¬c = ⊥-elim (nat-≡< (cong suc eq) (lb=2 {lton1 x} {lton1 y} a)) + ... | tri≈ ¬a b ¬c = b + ... | tri> ¬a ¬b c = ⊥-elim (nat-≡< (cong suc (sym eq)) (lb=2 {lton1 y} {lton1 x} c)) + lb=1 {x} {y} {false} eq with <-cmp (lton x) (lton y) + ... | tri< a ¬b ¬c = ⊥-elim (nat-≡< (cong suc eq) (lb=0 {lton1 x} {lton1 y} a)) + ... | tri≈ ¬a b ¬c = b + ... | tri> ¬a ¬b c = ⊥-elim (nat-≡< (cong suc (sym eq)) (lb=0 {lton1 y} {lton1 x} c)) + + --- + --- lton is unique in a head + --- + lb-tf : {x y : List Bool } → ¬ (lton (true ∷ x) ≡ lton (false ∷ y)) + lb-tf {x} {y} eq with <-cmp (lton1 x) (lton1 y) + ... | tri< a ¬b ¬c = ⊥-elim ( nat-≡< eq (lb=01 a)) where + lb=01 : {x y : ℕ } → x < y → x + x < (y + y ∸ 1) + lb=01 {x} {y} x<y = begin + suc (x + x) ≡⟨ refl ⟩ + suc x + x ≤⟨ ≤-plus x<y ⟩ + y + x ≡⟨ refl ⟩ + pred (suc y + x) ≡⟨ cong (λ k → pred ( k + x)) (+-comm 1 y) ⟩ + pred ((y + 1) + x ) ≡⟨ cong pred (+-assoc y 1 x) ⟩ + pred (y + suc x) ≤⟨ px≤py (≤-plus-0 {suc x} {y} {y} x<y) ⟩ + (y + y) ∸ 1 ∎ where open ≤-Reasoning + ... | tri> ¬a ¬b c = ⊥-elim ( nat-≡< (sym eq) (lb=02 c) ) where + lb=02 : {x y : ℕ } → x < y → x + x ∸ 1 < y + y + lb=02 {0} {y} lt = ≤-trans lt x≤x+y + lb=02 {suc x} {y} lt = begin + suc ( suc x + suc x ∸ 1 ) ≡⟨ refl ⟩ + suc x + suc x ≤⟨ ≤-plus {suc x} (<to≤ lt) ⟩ + y + suc x ≤⟨ ≤-plus-0 (<to≤ lt) ⟩ + y + y ∎ where open ≤-Reasoning + ... | tri≈ ¬a b ¬c = ⊥-elim ( nat-≡< (sym eq) ( begin + suc (lton1 y + lton1 y ∸ 1) ≡⟨ sucprd ( 2lton1>0 y) ⟩ + lton1 y + lton1 y ≡⟨ cong (λ k → k + k ) (sym b) ⟩ + lton1 x + lton1 x ∎ )) where open ≤-Reasoning + + --- + --- lton uniqueness + --- + lb=b : (x y : List Bool) → lton x ≡ lton y → x ≡ y + lb=b [] [] eq = refl + lb=b [] (x ∷ y) eq = ⊥-elim ( nat-≡< eq (lton-cons>0 {x} {y} )) + lb=b (x ∷ y) [] eq = ⊥-elim ( nat-≡< (sym eq) (lton-cons>0 {x} {y} )) + lb=b (true ∷ x) (false ∷ y) eq = ⊥-elim ( lb-tf {x} {y} eq ) + lb=b (false ∷ x) (true ∷ y) eq = ⊥-elim ( lb-tf {y} {x} (sym eq) ) + lb=b (true ∷ x) (true ∷ y) eq = cong (λ k → true ∷ k ) (lb=b x y (lb=1 {x} {y} {true} eq)) + lb=b (false ∷ x) (false ∷ y) eq = cong (λ k → false ∷ k ) (lb=b x y (lb=1 {x} {y} {false} eq)) + + lb : (n : ℕ) → LB n lton + lb zero = record { nlist = [] ; isBin = refl ; isUnique = lb05 } where + lb05 : (x : List Bool) → lton x ≡ zero → [] ≡ x + lb05 x eq = lb=b [] x (sym eq) + lb (suc n) with LB.nlist (lb n) | inspect LB.nlist (lb n) + ... | [] | record { eq = eq } = record { nlist = false ∷ [] ; isUnique = lb06 ; isBin = lb10 } where + open ≡-Reasoning + lb10 : lton1 (false ∷ []) ∸ 1 ≡ suc n + lb10 = begin + lton (false ∷ []) ≡⟨ refl ⟩ + suc 0 ≡⟨ refl ⟩ + suc (lton []) ≡⟨ cong (λ k → suc (lton k)) (sym eq) ⟩ + suc (lton (LB.nlist (lb n))) ≡⟨ cong suc (LB.isBin (lb n) ) ⟩ + suc n ∎ + lb06 : (x : List Bool) → pred (lton1 x ) ≡ suc n → false ∷ [] ≡ x + lb06 x eq1 = lb=b (false ∷ []) x (trans lb10 (sym eq1)) -- lton (false ∷ []) ≡ lton x + ... | false ∷ t | record { eq = eq } = record { nlist = true ∷ t ; isBin = lb01 ; isUnique = lb09 } where + lb01 : lton (true ∷ t) ≡ suc n + lb01 = begin + lton (true ∷ t) ≡⟨ refl ⟩ + lton1 t + lton1 t ≡⟨ sym ( sucprd (2lton1>0 t) ) ⟩ + suc (pred (lton1 t + lton1 t )) ≡⟨ refl ⟩ + suc (lton (false ∷ t)) ≡⟨ cong (λ k → suc (lton k )) (sym eq) ⟩ + suc (lton (LB.nlist (lb n))) ≡⟨ cong suc (LB.isBin (lb n)) ⟩ + suc n ∎ where open ≡-Reasoning + lb09 : (x : List Bool) → lton1 x ∸ 1 ≡ suc n → true ∷ t ≡ x + lb09 x eq1 = lb=b (true ∷ t) x (trans lb01 (sym eq1) ) -- lton (true ∷ t) ≡ lton x + ... | true ∷ t | record { eq = eq } = record { nlist = lb+1 (true ∷ t) ; isBin = lb02 (true ∷ t) lb03 ; isUnique = lb07 } where + lb03 : lton (true ∷ t) ≡ n + lb03 = begin + lton (true ∷ t) ≡⟨ cong (λ k → lton k ) (sym eq ) ⟩ + lton (LB.nlist (lb n)) ≡⟨ LB.isBin (lb n) ⟩ + n ∎ where open ≡-Reasoning + + add11 : (x1 : ℕ ) → suc x1 + suc x1 ≡ suc (suc (x1 + x1)) + add11 zero = refl + add11 (suc x) = cong (λ k → suc (suc k)) (trans (+-comm x _) (cong suc (+-comm _ x))) + + lb04 : (t : List Bool) → suc (lton1 t) ≡ lton1 (lb+1 t) + lb04 [] = refl + lb04 (false ∷ t) = refl + lb04 (true ∷ []) = refl + lb04 (true ∷ t0 ) = begin + suc (suc (lton1 t0 + lton1 t0)) ≡⟨ sym (add11 (lton1 t0)) ⟩ + suc (lton1 t0) + suc (lton1 t0) ≡⟨ cong (λ k → k + k ) (lb04 t0 ) ⟩ + lton1 (lb+1 t0) + lton1 (lb+1 t0) ∎ where + open ≡-Reasoning + + lb02 : (t : List Bool) → lton t ≡ n → lton (lb+1 t) ≡ suc n + lb02 [] refl = refl + lb02 t eq1 = begin + lton (lb+1 t) ≡⟨ refl ⟩ + pred (lton1 (lb+1 t)) ≡⟨ cong pred (sym (lb04 t)) ⟩ + pred (suc (lton1 t)) ≡⟨ sym (sucprd (lton1>0 t)) ⟩ + suc (pred (lton1 t)) ≡⟨ refl ⟩ + suc (lton t) ≡⟨ cong suc eq1 ⟩ + suc n ∎ where open ≡-Reasoning + + lb07 : (x : List Bool) → pred (lton1 x ) ≡ suc n → lb+1 (true ∷ t) ≡ x + lb07 x eq1 = lb=b (lb+1 (true ∷ t)) x (trans ( lb02 (true ∷ t) lb03 ) (sym eq1))
--- a/src/logic.agda Mon Jul 05 11:02:41 2021 +0900 +++ b/src/logic.agda Thu Jul 08 08:40:51 2021 +0900 @@ -74,6 +74,17 @@ open import Relation.Binary.PropositionalEquality +record Bijection {n m : Level} (R : Set n) (S : Set m) : Set (n Level.⊔ m) where + field + fun← : S → R + fun→ : R → S + fiso← : (x : R) → fun← ( fun→ x ) ≡ x + fiso→ : (x : S ) → fun→ ( fun← x ) ≡ x + +injection : {n m : Level} (R : Set n) (S : Set m) (f : R → S ) → Set (n Level.⊔ m) +injection R S f = (x y : R) → f x ≡ f y → x ≡ y + + ¬t=f : (t : Bool ) → ¬ ( not t ≡ t) ¬t=f true () ¬t=f false ()
--- a/src/nat.agda Mon Jul 05 11:02:41 2021 +0900 +++ b/src/nat.agda Thu Jul 08 08:40:51 2021 +0900 @@ -89,6 +89,17 @@ suc (suc (div2-rev (div2 x))) ≡⟨ cong (λ k → suc (suc k)) (div2-eq x) ⟩ suc (suc x) ∎ where open ≡-Reasoning +sucprd : {i : ℕ } → 0 < i → suc (pred i) ≡ i +sucprd {suc i} 0<i = refl + +0<s : {x : ℕ } → zero < suc x +0<s {_} = s≤s z≤n + +px<py : {x y : ℕ } → pred x < pred y → x < y +px<py {zero} {suc y} lt = 0<s +px<py {suc zero} {suc (suc y)} (s≤s lt) = s≤s 0<s +px<py {suc (suc x)} {suc (suc y)} (s≤s lt) = s≤s (px<py {suc x} {suc y} lt) + minus : (a b : ℕ ) → ℕ minus a zero = a minus zero (suc b) = zero @@ -130,9 +141,6 @@ suc x ∎ where open ≡-Reasoning -0<s : {x : ℕ } → zero < suc x -0<s {_} = s≤s z≤n - <-minus-0 : {x y z : ℕ } → z + x < z + y → x < y <-minus-0 {x} {suc _} {zero} lt = lt <-minus-0 {x} {y} {suc z} (s≤s lt) = <-minus-0 {x} {y} {z} lt @@ -198,6 +206,19 @@ x<y→≤ {zero} {.(suc _)} (s≤s z≤n) = z≤n x<y→≤ {suc x} {suc y} (s≤s lt) = s≤s (x<y→≤ {x} {y} lt) +≤→= : {i j : ℕ} → i ≤ j → j ≤ i → i ≡ j +≤→= {0} {0} z≤n z≤n = refl +≤→= {suc i} {suc j} (s≤s i<j) (s≤s j<i) = cong suc ( ≤→= {i} {j} i<j j<i ) + +px≤x : {x : ℕ } → pred x ≤ x +px≤x {zero} = refl-≤ +px≤x {suc x} = refl-≤s + +px≤py : {x y : ℕ } → x ≤ y → pred x ≤ pred y +px≤py {zero} {zero} lt = refl-≤ +px≤py {zero} {suc y} lt = z≤n +px≤py {suc x} {suc y} (s≤s lt) = lt + open import Data.Product i-j=0→i=j : {i j : ℕ } → j ≤ i → i - j ≡ 0 → i ≡ j @@ -206,6 +227,11 @@ i-j=0→i=j {suc i} {zero} z≤n () i-j=0→i=j {suc i} {suc j} (s≤s lt) eq = cong suc (i-j=0→i=j {i} {j} lt eq) +m*n=0⇒m=0∨n=0 : {i j : ℕ} → i * j ≡ 0 → (i ≡ 0) ∨ ( j ≡ 0 ) +m*n=0⇒m=0∨n=0 {zero} {j} refl = case1 refl +m*n=0⇒m=0∨n=0 {suc i} {zero} eq = case2 refl + + minus+1 : {x y : ℕ } → y ≤ x → suc (minus x y) ≡ minus (suc x) y minus+1 {zero} {zero} y≤x = refl minus+1 {suc x} {zero} y≤x = refl