changeset 213:9aec75fa796c

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 21 Jun 2021 08:08:08 +0900
parents cb36711e8b06
children 906b43b94228
files automaton-in-agda/src/gcd.agda
diffstat 1 files changed, 46 insertions(+), 64 deletions(-) [+]
line wrap: on
line diff
--- a/automaton-in-agda/src/gcd.agda	Mon Jun 21 00:43:09 2021 +0900
+++ b/automaton-in-agda/src/gcd.agda	Mon Jun 21 08:08:08 2021 +0900
@@ -188,59 +188,31 @@
     suc f * k ≡⟨ +-comm 0 _ ⟩
     suc f * k + 0 ∎  )) where open ≤-Reasoning  
 
+div+div : { i j k : ℕ } →  Dividable k i →  Dividable k j → Dividable k (i + j) ∧ Dividable k (j + i)
+div+div {i} {j} {k} di dj = ⟪ div+div1 , subst (λ g → Dividable k g) (+-comm i j) div+div1 ⟫ where
+      fki = Dividable.factor di
+      fkj = Dividable.factor dj
+      div+div1 : Dividable k (i + j)
+      div+div1 = record { factor = fki + fkj  ; is-factor = ( begin 
+          (fki + fkj) * k + 0 ≡⟨ +-comm _ 0 ⟩
+          (fki + fkj) * k  ≡⟨ *-distribʳ-+ k fki _ ⟩
+          fki * k + fkj * k  ≡⟨ cong₂ ( λ i j → i + j ) (+-comm 0 (fki * k)) (+-comm 0 (fkj * k)) ⟩
+          (fki * k + 0) + (fkj * k + 0) ≡⟨ cong₂ ( λ i j → i + j ) (Dividable.is-factor di) (Dividable.is-factor dj) ⟩
+          i + j  ∎ ) } where
+             open ≡-Reasoning  
+
 div-div : { i j k : ℕ } → k > 1 →  Dividable k i →  Dividable k j → Dividable k (i - j) ∧ Dividable k (j - i)
-div-div {i} {j} {suc k} k>1 di dj = div-div0 di dj where
-   div-div1 : {i j : ℕ}   →  Dividable (suc k) i →  Dividable (suc k) j → i < j  → Dividable (suc k) (j - i)
-   div-div1 {i} {j} record { factor = fi ; is-factor = fai } record { factor = fj ; is-factor = faj } i<j =
-            subst (λ g →  Dividable (suc k) g ) div-div3 ( div-div2 fj fi fi<fj ) where
-      fi<fj : fi < fj
-      fi<fj with <-cmp fi fj
-      ... | tri< a ¬b ¬c = a
-      ... | tri≈ ¬a b ¬c = ⊥-elim ( nat-≡< (cong (λ g → g * suc k + 0) b) (begin
-             suc (fi * suc k + 0)  ≡⟨ cong suc fai ⟩
-             suc i  ≤⟨ i<j ⟩
-             j  ≡⟨ sym faj ⟩
-             fj * suc k + 0 ∎  )) where open ≤-Reasoning  
-      ... | tri> ¬a ¬b c = ⊥-elim ( nat-<> (*-monoˡ-< k c ) (begin
-             suc (fi * suc k) ≡⟨ +-comm 0 _ ⟩
-             suc (fi * suc k + 0) ≡⟨ cong suc fai ⟩
-             suc i ≤⟨ i<j ⟩
-             j ≡⟨ sym faj ⟩
-             fj * suc k + 0 ≡⟨ +-comm _ 0 ⟩
-             fj * suc k ∎  )) where open ≤-Reasoning  
-      div-div3 : (fj * suc k) - (fi * suc k) ≡ j - i
-      div-div3 = begin (fj * suc k) - (fi * suc k) ≡⟨  cong₂ (λ g h → g - h) (+-comm 0 (fj * suc k)) (+-comm 0 (fi * suc k)) ⟩
-          (fj * suc k + 0) - (fi * suc k + 0) ≡⟨  cong₂ (λ g h → g - h) faj  fai ⟩
-          j - i ∎  where open ≡-Reasoning  
-      div-div2 : (fj fi : ℕ) → fi < fj → Dividable (suc k) ((fj * suc k) - (fi * suc k))
-      div-div2 zero fi i<j = subst (λ g → Dividable (suc k) g) (begin
-          0 ≡⟨ sym (minus<=0 {0} {fi * suc k} z≤n ) ⟩
-          0 -  (fi * suc k) ≡⟨ refl ⟩
-          (zero * suc k) - (fi * suc k) ∎ ) div0
-          where open ≡-Reasoning  
-      div-div2 (suc fj) fi i<j with <-cmp fi fj
-      ... | tri> ¬a ¬b c = ⊥-elim ( nat-≤> c i<j  )
-      ... | tri≈ ¬a refl ¬c = record { factor = 1 ; is-factor = (begin
-             1 * suc k + 0 ≡⟨ +-comm _ 0 ⟩
-               1 * suc k ≡⟨ cong suc (+-comm _ 0) ⟩
-             suc k ≡⟨ sym (minus+y-y {suc k} {fj * suc k}) ⟩
-             (suc k + fj * suc k) - (fj * suc k) ≡⟨ refl ⟩
-             (suc (k + fj * suc k)) - (fj * suc k) ∎  )} where open ≡-Reasoning  
-      ... | tri< fi<fj ¬b ¬c = record { factor = suc (Dividable.factor (div-div2 fj fi fi<fj )) ; is-factor = ( begin 
-          suc (Dividable.factor (div-div2 fj fi fi<fj )) * suc k + 0 ≡⟨ +-comm _ 0 ⟩
-          suc (Dividable.factor (div-div2 fj fi fi<fj )) * suc k  ≡⟨ refl ⟩
-          suc k + ((Dividable.factor (div-div2 fj fi fi<fj )) * suc k )  ≡⟨ cong (λ g → suc k + g ) (+-comm 0 _) ⟩
-          suc k + ((Dividable.factor (div-div2 fj fi fi<fj )) * suc k + 0)  ≡⟨ cong (λ g → suc k + g) (Dividable.is-factor (div-div2 fj fi fi<fj) ) ⟩
-          suc k + ((fj * suc k) - (fi * suc k)) ≡⟨ minus+yz {suc k} {fj * suc k} {fi * suc k} (<to≤ (*-monoˡ-< k fi<fj )) ⟩
-           ( (suc k + (fj * suc k)) - (fi * suc k)) ≡⟨ refl ⟩
-          ((suc fj * suc k) - (fi * suc k)) ∎ ) } where
+div-div {i} {j} {k} k>1 di dj = ⟪ div-div1 di dj , div-div1 dj di ⟫ where
+      div-div1 : {i j : ℕ } → Dividable k i →  Dividable k j → Dividable k (i - j)
+      div-div1 {i} {j} di dj = record { factor = fki - fkj  ; is-factor = ( begin 
+          (fki - fkj) * k + 0 ≡⟨ +-comm _ 0 ⟩
+          (fki - fkj) * k  ≡⟨ distr-minus-* {fki} {fkj}  ⟩
+          (fki * k) - (fkj * k)  ≡⟨ cong₂ ( λ i j → i - j ) (+-comm 0 (fki * k)) (+-comm 0 (fkj * k)) ⟩
+          (fki * k + 0) - (fkj * k + 0) ≡⟨ cong₂ ( λ i j → i - j ) (Dividable.is-factor di) (Dividable.is-factor dj) ⟩
+          i - j  ∎ ) } where
              open ≡-Reasoning  
-   div-div0 : { i j : ℕ } →  Dividable (suc k) i →  Dividable (suc k) j → Dividable (suc k) (i - j) ∧ Dividable (suc k) (j - i)
-   div-div0 {i} {j} di dj with <-cmp i j
-   ... | tri< a ¬b ¬c    = ⟪ subst (λ g → Dividable (suc k) g) (sym (minus<=0 {i} {j} (<to≤ a))) div0 , div-div1 di dj a ⟫ 
-   ... | tri≈ ¬a refl ¬c = ⟪ subst (λ g → Dividable (suc k) g) (sym (minus<=0 {i} {i} refl-≤)) div0 ,
-                             subst (λ g → Dividable (suc k) g) (sym (minus<=0 {i} {i} refl-≤)) div0 ⟫
-   ... | tri> ¬a ¬b c    = ⟪ div-div1 dj di c , subst (λ g → Dividable (suc k) g) (sym (minus<=0 {j} {i} (<to≤ c))) div0  ⟫ 
+             fki = Dividable.factor di
+             fkj = Dividable.factor dj
 
 open _∧_
 
@@ -347,9 +319,9 @@
         ... | tri> ¬a ¬b c = record { ni =  i - j ; nj = suc j ; fdec = λ lt →
             subst₂ (λ s t → s < t) (Fsym {suc j} {i - j}) (Fsym {suc j} {suc i}) (fd1 j i (i - j) c refl ) } 
         ind :   ( i j : ℕ ) →
-            Dividable (gcd (Fdec.ni (fedc0 i j)) (Fdec.nj (fedc0 i j))) (Fdec.ni (fedc0 i j))
+              Dividable (gcd (Fdec.ni (fedc0 i j)) (Fdec.nj (fedc0 i j))) (Fdec.ni (fedc0 i j))
             ∧ Dividable (gcd (Fdec.ni (fedc0 i j)) (Fdec.nj (fedc0 i j))) (Fdec.nj (fedc0 i j))
-             → Dividable (gcd i j) i ∧ Dividable (gcd i j) j
+            → Dividable (gcd i j) i ∧ Dividable (gcd i j) j
         ind zero zero prev = ind0 where
            ind0 : Dividable (gcd zero zero) zero ∧ Dividable (gcd zero zero) zero
            ind0 = ⟪ div0 , div0 ⟫
@@ -360,11 +332,11 @@
            ind2 : Dividable (gcd (suc i) zero) (suc i) ∧ Dividable (gcd (suc i) zero) zero
            ind2 = ⟪  subst (λ k → Dividable k (suc i)) (sym (trans refl (gcd20 (suc i)))) div= , div0 ⟫
         ind (suc i) (suc j) prev with <-cmp i j
-        ... | tri< a ¬b ¬c = ⟪ ind3 (suc i) (proj1 prev)   , ind4 (proj2 prev) ⟫ where
-            ind3 : (s : ℕ ) → Dividable (gcd1 (suc i) (suc i) (j - i) (j - i)) s
-                 → Dividable (gcd1 (suc i) (suc i) (suc j) (suc j)) s 
-            ind3 s prev = 
-               subst (λ k → Dividable k s) ( begin
+        ... | tri< a ¬b ¬c = ⟪ ind3 (proj1 prev)   , ind6 (ind4 (proj2 prev)) (ind3 (proj1 prev)) ⟫ where
+            ind3 :  Dividable (gcd (suc i) (j - i)) (suc i)
+                  → Dividable (gcd (suc i) (suc j)) (suc i) 
+            ind3 prev = 
+               subst (λ k → Dividable k (suc i)) ( begin
                  gcd (suc i) (j - i)  ≡⟨ gcdsym {suc i} {j - i} ⟩
                  gcd (j - i ) (suc i)   ≡⟨ sym (gcd+j (j - i) (suc i)) ⟩
                  gcd ((j - i) + suc i) (suc i)  ≡⟨ cong (λ k → gcd k (suc i)) ( begin
@@ -372,13 +344,23 @@
                   suc j ∎ ) ⟩
                  gcd (suc j) (suc i)  ≡⟨ gcdsym {suc j} {suc i} ⟩
                  gcd (suc i) (suc j)  ∎ ) prev where open ≡-Reasoning 
-            ind4 : Dividable (gcd (suc i) (j - i)) (j - i) → Dividable (gcd (suc i) (suc j)) (suc j)
-            ind4 = {!!}
-        ... | tri≈ ¬a b ¬c = {!!}
+            ind7 : (j - i) + suc i ≡ suc j
+            ind7 = begin (suc j - suc i) + suc i ≡⟨ minus+n {suc j} {suc i} (<-trans (s≤s a) a<sa)  ⟩
+                        suc j ∎  where open ≡-Reasoning 
+            ind6 : {k : ℕ } → Dividable k (j - i) → Dividable k (suc i) → Dividable k (suc j)
+            ind6 {k} dj di = subst (λ g → Dividable k g ) ind7 (proj1 (div+div dj di)) 
+            ind4 : Dividable (gcd (suc i) (j - i)) (j - i)
+                 → Dividable (gcd (suc i) (suc j)) (j - i)
+            ind4 prev = subst (λ k → k) ( begin
+                 Dividable (gcd (suc i) (j - i)) (j - i)  ≡⟨ cong  (λ k → Dividable k (j - i)) (gcdsym {suc i}  ) ⟩
+                 Dividable (gcd (j - i ) (suc i) ) (j - i)  ≡⟨ cong  (λ k → Dividable k (j - i)) ( sym (gcd+j  (j - i) (suc i))) ⟩
+                 Dividable (gcd ((j - i) + suc i) (suc i)) (j - i)  ≡⟨ cong  (λ k → Dividable (gcd k (suc i)) (j - i)) ind7 ⟩
+                 Dividable (gcd (suc j) (suc i)) (j - i)    ≡⟨ cong  (λ k → Dividable k (j - i)) (gcdsym {suc j} ) ⟩
+                 Dividable (gcd (suc i) (suc j)) (j - i)   ∎ ) prev where open ≡-Reasoning 
+        ... | tri≈ ¬a refl ¬c = ⟪ ind5 , ind5 ⟫ where
+           ind5 : Dividable (gcd (suc i) (suc i)) (suc i) 
+           ind5 = subst (λ k → Dividable k (suc j)) (sym (gcdmm (suc i) (suc i))) div=  
         ... | tri> ¬a ¬b c = {!!}
-        --ind3 where
-        --   ind3 : Dividable (gcd (suc i) (suc j)) (suc i) ∧ Dividable (gcd (suc i) (suc j)) (suc j)
-        --   ind3 = {!!}
 
         I : Finduction (ℕ ∧ ℕ) _ F
         I = record {