changeset 208:984630d2fb0c

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sun, 20 Jun 2021 10:09:40 +0900
parents 764bc577b1e9
children 1c537e2b8f69
files automaton-in-agda/src/gcd.agda
diffstat 1 files changed, 39 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/automaton-in-agda/src/gcd.agda	Sat Jun 19 11:52:45 2021 +0900
+++ b/automaton-in-agda/src/gcd.agda	Sun Jun 20 10:09:40 2021 +0900
@@ -189,24 +189,26 @@
 
 gcd-divable : ( i i0 j j0 : ℕ )
       → (if : Factor i0 j0) (jf : Factor j0 i0)   -- factor eq * i0 + (j0 - i0) = j0
-      → remain if ≡ j - i  → remain jf ≡ i - j
+      → ((i0 ≤ j0) ∧ (remain if ≡ j - i))  ∨ ((j0 ≤ i0) ∧ (remain jf ≡ i - j))
       → Dividable ( gcd1 i i0 j j0 ) i0 ∧ Dividable ( gcd1 i i0 j j0 ) j0
-gcd-divable zero i0 zero j0 if jf if=0 jf=0 with <-cmp i0 j0
-... | tri< a ¬b ¬c = ⟪ record { factor = 1 ; is-factor = gg1 } ,  record { factor = factor if ; is-factor = gg2 } ⟫ where
-    gg2 : factor if *  i0 + 0 ≡ j0
-    gg2 = begin
-      factor if * i0 + 0 ≡⟨ cong (λ k → factor if * i0 + k) (sym if=0) ⟩
+gcd-divable zero i0 zero j0 if jf if=0∨jf=0 with <-cmp i0 j0
+... | tri< a ¬b ¬c = ⟪ record { factor = 1 ; is-factor = gg1 } ,  record { factor = factor if ; is-factor = (gg2 if=0∨jf=0) } ⟫ where
+    gg2 : (if=0∨jf=0 : ((i0 ≤ j0) ∧ (remain if ≡ 0)) ∨ ((j0 ≤ i0) ∧ (remain jf ≡ 0))) →  factor if *  i0 + 0 ≡ j0
+    gg2 (case1 x) = begin
+      factor if * i0 + 0 ≡⟨ cong (λ k → factor if * i0 + k) (sym (proj2 x)) ⟩
       factor if * i0 + remain if ≡⟨ is-factor if ⟩
       j0 ∎   where open ≡-Reasoning  
+    gg2 (case2 x) = ⊥-elim ( nat-≤> (proj1 x) a)
 ... | tri≈ ¬a refl ¬c = ⟪ record { factor = 1 ; is-factor = gg1 } ,  record { factor = 1 ; is-factor = gg1 } ⟫
-... | tri> ¬a ¬b c = ⟪ record { factor = factor jf ; is-factor = gg2 } ,  record { factor = 1 ; is-factor = gg1 } ⟫ where
-    gg2 : factor jf *  j0 + 0 ≡ i0
-    gg2 = begin
-      factor jf * j0 + 0 ≡⟨ cong (λ k → factor jf * j0 + k) (sym jf=0)  ⟩
+... | tri> ¬a ¬b c = ⟪ record { factor = factor jf ; is-factor = gg2 if=0∨jf=0  } ,  record { factor = 1 ; is-factor = gg1 } ⟫ where
+    gg2 : (if=0∨jf=0 : ((i0 ≤ j0) ∧ (remain if ≡ 0)) ∨ ((j0 ≤ i0) ∧ (remain jf ≡ 0))) → factor jf *  j0 + 0 ≡ i0
+    gg2 (case1 x) = ⊥-elim ( nat-≤> (proj1 x) c)
+    gg2 (case2 x) = begin
+      factor jf * j0 + 0 ≡⟨ cong (λ k → factor jf * j0 + k) (sym (proj2 x)) ⟩
       factor jf * j0 + remain jf ≡⟨ is-factor jf ⟩
       i0 ∎   where open ≡-Reasoning  
-gcd-divable zero i0 (suc zero) j0 if jf if=0 jf=0 =  ⟪ record { factor = i0 ; is-factor = gg3 } ,  record { factor = j0 ; is-factor = gg3 } ⟫ 
-gcd-divable zero zero (suc (suc j)) j0 if jf if=0 jf=0 = ⟪ record { factor = factor jf ; is-factor = gg4 } ,  record { factor = 1 ; is-factor = gg1 } ⟫
+gcd-divable zero i0 (suc zero) j0 if jf if=0∨jf=0 =  ⟪ record { factor = i0 ; is-factor = gg3 } ,  record { factor = j0 ; is-factor = gg3 } ⟫ 
+gcd-divable zero zero (suc (suc j)) j0 if jf if=0∨jf=0 = ⟪ record { factor = factor jf ; is-factor = gg4 } ,  record { factor = 1 ; is-factor = gg1 } ⟫
    where
     gg4 :  factor jf * j0  + 0 ≡ zero
     gg4 with  m*n≡0⇒m≡0∨n≡0 (factor jf) (  m+n≡0⇒m≡0 (factor jf * j0) (is-factor jf))
@@ -219,16 +221,15 @@
       factor jf * j0  ≡⟨ cong (λ k → factor jf * k) y  ⟩
       factor jf * 0  ≡⟨ *-comm (factor jf) 0  ⟩
       0 ∎   where open ≡-Reasoning
-gcd-divable zero (suc i0) (suc (suc j)) j0 if jf if=0 jf=0  =
+gcd-divable zero (suc i0) (suc (suc j)) j0 if jf if=0∨jf=0  =
     ⟪ record { factor = gg8 ; is-factor = {!!} } , record { factor = gg8 ; is-factor = {!!} } ⟫ where
     gg8 : ℕ
     gg8 = gcd1 i0 (suc i0) (suc j) (suc (suc j))
-    gg9 : factor if * suc i0 + (suc j - i0) ≡ suc (suc j) 
+    gg9 : 1 * suc i0 + (suc j - i0) ≡ suc (suc j)
     gg9 = begin
-      factor if * suc i0 + (suc j - i0)  ≡⟨ {!!}  ⟩
-      factor if * suc i0 + (suc (suc j) - zero)  ≡⟨ {!!} ⟩
-      factor if * suc i0 + remain if ≡⟨ is-factor if ⟩
-      j0  ≡⟨ {!!}  ⟩
+      1 * suc i0 + (suc j - i0)   ≡⟨ +-comm (1 * suc i0) _ ⟩
+      (suc (suc j) - suc i0 ) + 1 * suc i0    ≡⟨ cong (λ k →  (suc (suc j) - suc i0 ) + suc k ) (+-comm i0 0) ⟩
+      (suc (suc j) - suc i0 ) + suc i0    ≡⟨ minus+n (s≤s (s≤s {!!})) ⟩
       suc (suc j)  ∎   where open ≡-Reasoning
     gg10 : factor jf * suc (suc j) + (i0 - suc j) ≡ suc i0
     gg10 = begin
@@ -236,17 +237,19 @@
       factor jf * j0 + remain jf ≡⟨ is-factor jf  ⟩
       suc i0  ∎   where open ≡-Reasoning
     gg7 : Dividable gg8 (suc i0) ∧ Dividable gg8 (suc (suc j))
-    gg7 = gcd-divable i0 (suc i0) (suc j) (suc (suc j))
-        record { factor = factor if ; is-factor = gg9 ; remain = suc j - i0 }
-        record { factor = factor jf ; is-factor = gg10 ; remain = i0 - suc j } refl refl 
+    gg7 = gcd-divable i0 (suc i0) (suc j) (suc (suc j)) -- Factor (suc i0) (suc (suc j)),  Factor (suc (suc j)) (suc i0)
+        record { factor = 1 ; is-factor = {!!} ; remain = suc j - i0 }
+        record { factor = factor jf ; is-factor = {!!} ; remain = i0 - suc j } {!!} 
+--
+--   gcd i (i + j ) = gcd i j
 --if   : Factor (suc i0) j0    --  factor if * (suc i0) + (suc (suc j) - zero  ≡ j0
 --jf   : Factor j0 (suc i0)    --  factor jf * j0 + (zero - suc (suc j))) ≡ suc i0
 --if=0 : remain if ≡ (suc (suc j) - zero)
 --jf=0 : remain jf ≡ (zero - suc (suc j))
 --    factor if * suc i0 + (suc j - i0) ≡ suc (suc j)
 --    factor jf * suc (suc j) + (i0 - suc j) ≡ suc i
-gcd-divable (suc zero) i0 zero j0 if jf if=0 jf=0 = ⟪ record { factor = i0 ; is-factor = gg3 } ,  record { factor = j0 ; is-factor = gg3 } ⟫
-gcd-divable (suc (suc i)) i0 zero zero if jf if=0 jf=0 = ⟪ record { factor = 1 ; is-factor = gg1 } ,  record { factor = factor if ; is-factor = gg4 } ⟫
+gcd-divable (suc zero) i0 zero j0 if jf if=0∨jf=0 = ⟪ record { factor = i0 ; is-factor = gg3 } ,  record { factor = j0 ; is-factor = gg3 } ⟫
+gcd-divable (suc (suc i)) i0 zero zero if jf if=0∨jf=0 = ⟪ record { factor = 1 ; is-factor = gg1 } ,  record { factor = factor if ; is-factor = gg4 } ⟫
    where
     gg4 :  factor if * i0  + 0 ≡ zero
     gg4 with  m*n≡0⇒m≡0∨n≡0 (factor if) (  m+n≡0⇒m≡0 (factor if * i0) (is-factor if))
@@ -259,32 +262,36 @@
       factor if * i0  ≡⟨ cong (λ k → factor if * k) y  ⟩
       factor if * 0  ≡⟨ *-comm (factor if) 0  ⟩
       0 ∎   where open ≡-Reasoning
-gcd-divable (suc (suc i)) i0 zero (suc j0) if jf if=0 jf=0 with gcd-divable (suc i) (suc (suc i)) j0 (suc j0) {!!} {!!} refl refl
+gcd-divable (suc (suc i)) i0 zero (suc j0) if jf if=0∨jf=0 with gcd-divable (suc i) (suc (suc i)) j0 (suc j0) {!!} {!!} {!!}
 ... | t = ⟪ {!!} , {!!} ⟫
-gcd-divable (suc zero) i0 (suc j) j0 if jf if=0 jf=0 =  
+gcd-divable (suc zero) i0 (suc j) j0 if jf if=0∨jf=0 =  
      gcd-divable zero i0 j j0 record {  factor = factor if ; is-factor = gg4 ; remain = j - zero }
-                              record {  factor = factor jf ; is-factor = gg5 ; remain = zero - j  } refl refl where
+                              record {  factor = factor jf ; is-factor = gg5 ; remain = zero - j  } {!!} where
     gg4 : factor if * i0 + (j - zero) ≡ j0
     gg4 = begin
-      factor if * i0 + (j - zero)  ≡⟨  cong ( λ k → factor if * i0 + k) (sym if=0) ⟩
+      factor if * i0 + (j - zero)  ≡⟨  cong ( λ k → factor if * i0 + k) (sym {!!}) ⟩
       factor if * i0 + remain if ≡⟨ is-factor if   ⟩
       j0 ∎   where open ≡-Reasoning  
     gg5 : factor jf * j0 + (zero - j) ≡ i0
     gg5 = begin
-      factor jf * j0 + (zero - j)  ≡⟨  cong ( λ k → factor jf * j0 + k) (sym jf=0) ⟩
+      factor jf * j0 + (zero - j)  ≡⟨  cong ( λ k → factor jf * j0 + k) (sym {!!}) ⟩
       factor jf * j0 + remain jf ≡⟨ is-factor jf   ⟩
       i0 ∎   where open ≡-Reasoning  
-gcd-divable (suc (suc i)) i0 (suc j) j0 if jf if=0 jf=0 = 
+gcd-divable (suc (suc i)) i0 (suc j) j0 if jf if=0∨jf=0 = 
      gcd-divable (suc i) i0 j j0 record {  factor = factor if ; is-factor = gg4 ; remain = j - suc i }
-                              record {  factor = factor jf ; is-factor = gg5 ; remain = suc i - j } refl refl where
+                              record {  factor = factor jf ; is-factor = gg5 ; remain = suc i - j } (gg6 if=0∨jf=0) where
+    gg6 : ((i0 ≤ j0) ∧ (remain if ≡ (suc j - suc (suc i)))) ∨ ((j0 ≤ i0) ∧ (remain jf ≡ (suc (suc i) - suc j)))
+        → ((i0 ≤ j0) ∧ ((j - suc i) ≡ (j - suc i))) ∨ ((j0 ≤ i0) ∧ ((suc i - j) ≡ (suc i - j)))
+    gg6 (case1 x) = case1 ⟪ proj1 x , refl ⟫ 
+    gg6 (case2 x) = case2 ⟪ proj1 x , refl ⟫ 
     gg4 : factor if * i0 + (j - suc i ) ≡ j0
     gg4 = begin
-      factor if * i0 + ( j - suc i ) ≡⟨ cong ( λ k → factor if * i0 + k ) (sym if=0) ⟩ 
+      factor if * i0 + ( j - suc i ) ≡⟨ cong ( λ k → factor if * i0 + k ) (sym {!!}) ⟩ 
       factor if * i0 + remain if  ≡⟨ is-factor if   ⟩
       j0 ∎   where open ≡-Reasoning  
     gg5 : factor jf * j0 + (suc i - j) ≡ i0
     gg5 = begin
-      factor jf * j0 + ( suc i - j ) ≡⟨ cong ( λ k → factor jf * j0 + k ) (sym jf=0) ⟩  
+      factor jf * j0 + ( suc i - j ) ≡⟨ cong ( λ k → factor jf * j0 + k ) (sym {!!}) ⟩  
       factor jf * j0 + remain jf  ≡⟨ is-factor jf   ⟩
       i0 ∎   where open ≡-Reasoning