# HG changeset patch # User Shinji KONO # Date 1690416193 -32400 # Node ID 23db567b4098587e48315588d0f65cb44da8ea0f # Parent 0d8b093bc4e33a9c610588d17724ddc511799cb0 ... diff -r 0d8b093bc4e3 -r 23db567b4098 automaton-in-agda/src/non-regular.agda --- a/automaton-in-agda/src/non-regular.agda Thu Jul 27 08:21:21 2023 +0900 +++ b/automaton-in-agda/src/non-regular.agda Thu Jul 27 09:03:13 2023 +0900 @@ -10,7 +10,7 @@ open import automaton-ex open import finiteSetUtil open import finiteSet -open import Relation.Nullary +open import Relation.Nullary open import regular-language open import nat open import pumping @@ -25,17 +25,17 @@ list-eq (i0 ∷ s) (i0 ∷ s1) = false list-eq (i0 ∷ s) (i1 ∷ s1) = false list-eq (i1 ∷ s) (i0 ∷ s1) = false -list-eq (i1 ∷ s) (i1 ∷ s1) = list-eq s s1 +list-eq (i1 ∷ s) (i1 ∷ s1) = list-eq s s1 -input-addi0 : ( n : ℕ ) → List In2 → List In2 +input-addi0 : ( n : ℕ ) → List In2 → List In2 input-addi0 zero x = x input-addi0 (suc i) x = i0 ∷ input-addi0 i x -input-addi1 : ( n : ℕ ) → List In2 +input-addi1 : ( n : ℕ ) → List In2 input-addi1 zero = [] input-addi1 (suc i) = i1 ∷ input-addi1 i -inputnn0 : ( n : ℕ ) → List In2 +inputnn0 : ( n : ℕ ) → List In2 inputnn0 n = input-addi0 n (input-addi1 n) inputnn1-i1 : (i : ℕ) → List In2 → Bool @@ -49,7 +49,7 @@ inputnn1-i0 : (i : ℕ) → List In2 → ℕ ∧ List In2 inputnn1-i0 i [] = ⟪ i , [] ⟫ inputnn1-i0 i (i1 ∷ x) = ⟪ i , (i1 ∷ x) ⟫ -inputnn1-i0 i (i0 ∷ x) = inputnn1-i0 (suc i) x +inputnn1-i0 i (i0 ∷ x) = inputnn1-i0 (suc i) x open _∧_ @@ -97,7 +97,7 @@ nn08 zero () nn08 (suc i) () ... | i1 ∷ t | _ = +-comm 0 _ - nn07 (suc j) x eq = trans (nn07 j (suc x) (trans (cong (λ k → k + j) (+-comm 1 _ )) (trans (+-assoc x _ _) eq)) ) + nn07 (suc j) x eq = trans (nn07 j (suc x) (trans (cong (λ k → k + j) (+-comm 1 _ )) (trans (+-assoc x _ _) eq)) ) (trans (+-assoc 1 x _) (trans (cong (λ k → k + j) (+-comm 1 _) ) (+-assoc x 1 _) )) nn09 : (x : ℕ) → proj2 ( inputnn1-i0 0 (input-addi0 x (input-addi1 i))) ≡ input-addi1 i nn09 zero with input-addi1 i | inspect input-addi1 i @@ -107,7 +107,7 @@ nn08 zero () nn08 (suc i) () ... | i1 ∷ t | _ = refl - nn09 (suc j) = trans (nn30 (input-addi0 j (input-addi1 i)) 0) (nn09 j ) + nn09 (suc j) = trans (nn30 (input-addi0 j (input-addi1 i)) 0) (nn09 j ) nn04 : (i : ℕ) → inputnn1-i1 i (input-addi1 i) ≡ true nn04 zero = refl nn04 (suc i) = nn04 i @@ -128,21 +128,21 @@ open import Data.List.Properties open import nat -lemmaNN : (r : RegularLanguage In2 ) → ¬ ( (s : List In2) → isRegular inputnn1 s r ) +lemmaNN : (r : RegularLanguage In2 ) → ¬ ( (s : List In2) → isRegular inputnn1 s r ) lemmaNN r Rg = tann {TA.x TAnn} (TA.non-nil-y TAnn ) (TA.xyz=is TAnn) (tr-accept→ (automaton r) _ (astart r) (TA.trace-xyz TAnn) ) (tr-accept→ (automaton r) _ (astart r) (TA.trace-xyyz TAnn) ) where n : ℕ n = suc (finite (afin r)) - nn = inputnn0 n + nn = inputnn0 n nn03 : accept (automaton r) (astart r) nn ≡ true nn03 = subst (λ k → k ≡ true ) (Rg nn ) (nn01 n) nn09 : (n m : ℕ) → n ≤ n + m nn09 zero m = z≤n nn09 (suc n) m = s≤s (nn09 n m) nn04 : Trace (automaton r) nn (astart r) - nn04 = tr-accept← (automaton r) nn (astart r) nn03 + nn04 = tr-accept← (automaton r) nn (astart r) nn03 nntrace = tr→qs (automaton r) nn (astart r) nn04 - nn07 : (n : ℕ) → length (inputnn0 n ) ≡ n + n + nn07 : (n : ℕ) → length (inputnn0 n ) ≡ n + n nn07 i = nn19 i where nn17 : (i : ℕ) → length (input-addi1 i) ≡ i nn17 zero = refl @@ -154,7 +154,7 @@ nn19 i = begin length (input-addi0 i ( input-addi1 i )) ≡⟨ nn18 i i ⟩ i + length (input-addi1 i) ≡⟨ cong (λ k → i + k) ( nn17 i) ⟩ - i + i ∎ where open ≡-Reasoning + i + i ∎ where open ≡-Reasoning nn05 : length nntrace > finite (afin r) nn05 = begin suc (finite (afin r)) ≤⟨ nn09 _ _ ⟩ @@ -169,6 +169,8 @@ open import Tactic.MonoidSolver using (solve; solve-macro) + -- there is a counter example + -- tann : {x y z : List In2} → ¬ y ≡ [] → x ++ y ++ z ≡ nn → accept (automaton r) (astart r) (x ++ y ++ z) ≡ true → ¬ (accept (automaton r) (astart r) (x ++ y ++ y ++ z) ≡ true ) @@ -181,24 +183,28 @@ count1 [] = 0 count1 (i1 ∷ x) = suc (count1 x) count1 (i0 ∷ x) = count1 x + -- + -- prove some obvious fact + -- c0+1=n : (x : List In2 ) → count0 x + count1 x ≡ length x c0+1=n [] = refl c0+1=n (i0 ∷ t) = cong suc ( c0+1=n t ) c0+1=n (i1 ∷ t) = begin - count0 t + suc (count1 t) ≡⟨ sym (+-assoc (count0 t) _ _) ⟩ - (count0 t + 1 ) + count1 t ≡⟨ cong (λ k → k + count1 t) (+-comm _ 1 ) ⟩ - suc (count0 t + count1 t) ≡⟨ cong suc ( c0+1=n t ) ⟩ + count0 t + suc (count1 t) ≡⟨ sym (+-assoc (count0 t) _ _) ⟩ + (count0 t + 1 ) + count1 t ≡⟨ cong (λ k → k + count1 t) (+-comm _ 1 ) ⟩ + suc (count0 t + count1 t) ≡⟨ cong suc ( c0+1=n t ) ⟩ suc (length t) ∎ where open ≡-Reasoning + -- nn15 : (x : List In2 ) → inputnn1 x ≡ true → count0 x ≡ count1 x nn15 x eq = nn18 where - nn17 : (x : List In2 ) → (count0 x ≡ proj1 (inputnn1-i0 0 x) + count0 (proj2 (inputnn1-i0 0 x))) + nn17 : (x : List In2 ) → (count0 x ≡ proj1 (inputnn1-i0 0 x) + count0 (proj2 (inputnn1-i0 0 x))) ∧ (count1 x ≡ 0 + count1 (proj2 (inputnn1-i0 0 x))) nn17 [] = ⟪ refl , refl ⟫ nn17 (i0 ∷ t ) with nn17 t ... | ⟪ eq1 , eq2 ⟫ = ⟪ begin suc (count0 t ) ≡⟨ cong suc eq1 ⟩ suc (proj1 (inputnn1-i0 0 t) + count0 (proj2 (inputnn1-i0 0 t))) ≡⟨ cong₂ _+_ (sym (nn31 t 0)) (cong count0 (sym (nn30 t 0))) ⟩ - proj1 (inputnn1-i0 1 t) + count0 (proj2 (inputnn1-i0 1 t)) ∎ + proj1 (inputnn1-i0 1 t) + count0 (proj2 (inputnn1-i0 1 t)) ∎ , trans eq2 (cong count1 (sym (nn30 t 0))) ⟫ where open ≡-Reasoning nn20 : proj2 (inputnn1-i0 1 t) ≡ proj2 (inputnn1-i0 0 t) @@ -208,109 +214,116 @@ nn19 zero [] eq = ⟪ refl , refl ⟫ nn19 zero (i0 ∷ y) () nn19 zero (i1 ∷ y) () - nn19 (suc i) (i1 ∷ y) eq with nn19 i y eq + nn19 (suc i) (i1 ∷ y) eq with nn19 i y eq ... | t = ⟪ proj1 t , cong suc (proj2 t ) ⟫ nn18 : count0 x ≡ count1 x nn18 = begin - count0 x ≡⟨ proj1 (nn17 x) ⟩ - proj1 (inputnn1-i0 0 x) + count0 (proj2 (inputnn1-i0 0 x)) ≡⟨ cong (λ k → proj1 (inputnn1-i0 0 x) + k) - (proj1 (nn19 (proj1 (inputnn1-i0 0 x)) (proj2 (inputnn1-i0 0 x)) eq)) ⟩ - proj1 (inputnn1-i0 0 x) + 0 ≡⟨ +-comm _ 0 ⟩ - 0 + proj1 (inputnn1-i0 0 x) ≡⟨ cong (λ k → 0 + k) (sym (proj2 (nn19 _ _ eq))) ⟩ - 0 + count1 (proj2 (inputnn1-i0 0 x)) ≡⟨ sym (proj2 (nn17 x)) ⟩ + count0 x ≡⟨ proj1 (nn17 x) ⟩ + proj1 (inputnn1-i0 0 x) + count0 (proj2 (inputnn1-i0 0 x)) ≡⟨ cong (λ k → proj1 (inputnn1-i0 0 x) + k) + (proj1 (nn19 (proj1 (inputnn1-i0 0 x)) (proj2 (inputnn1-i0 0 x)) eq)) ⟩ + proj1 (inputnn1-i0 0 x) + 0 ≡⟨ +-comm _ 0 ⟩ + 0 + proj1 (inputnn1-i0 0 x) ≡⟨ cong (λ k → 0 + k) (sym (proj2 (nn19 _ _ eq))) ⟩ + 0 + count1 (proj2 (inputnn1-i0 0 x)) ≡⟨ sym (proj2 (nn17 x)) ⟩ count1 x ∎ where open ≡-Reasoning - cong0 : (x y : List In2 ) → count0 (x ++ y ) ≡ count0 x + count0 y - cong0 [] y = refl - cong0 (i0 ∷ x) y = cong suc (cong0 x y) - cong0 (i1 ∷ x) y = cong0 x y - cong1 : (x y : List In2 ) → count1 (x ++ y ) ≡ count1 x + count1 y - cong1 [] y = refl - cong1 (i1 ∷ x) y = cong suc (cong1 x y) - cong1 (i0 ∷ x) y = cong1 x y + distr0 : (x y : List In2 ) → count0 (x ++ y ) ≡ count0 x + count0 y + distr0 [] y = refl + distr0 (i0 ∷ x) y = cong suc (distr0 x y) + distr0 (i1 ∷ x) y = distr0 x y + distr1 : (x y : List In2 ) → count1 (x ++ y ) ≡ count1 x + count1 y + distr1 [] y = refl + distr1 (i1 ∷ x) y = cong suc (distr1 x y) + distr1 (i0 ∷ x) y = distr1 x y + -- + -- i0 .. i0 ∷ i1 .. i1 sequece does not contains i1 → i0 transition + -- record i1i0 (z : List In2) : Set where field a b : List In2 i10 : z ≡ a ++ (i1 ∷ i0 ∷ b ) nn12 : (x : List In2 ) → inputnn1 x ≡ true → ¬ i1i0 x nn12 x eq = nn17 x 0 eq where - nn17 : (x : List In2 ) → (i : ℕ) + nn17 : (x : List In2 ) → (i : ℕ) → inputnn1-i1 (proj1 (inputnn1-i0 i x)) (proj2 (inputnn1-i0 i x)) ≡ true → ¬ i1i0 x nn17 [] i eq li with i1i0.a li | i1i0.i10 li ... | [] | () ... | x ∷ s | () - nn17 (i0 ∷ x₁) i eq li = nn17 x₁ (suc i) eq record { a = nn18 (i1i0.a li) (i1i0.i10 li) ; b = i1i0.b li + nn17 (i0 ∷ x₁) i eq li = nn17 x₁ (suc i) eq record { a = nn18 (i1i0.a li) (i1i0.i10 li) ; b = i1i0.b li ; i10 = nn19 (i1i0.a li) (i1i0.i10 li) } where + -- first half nn18 : (a : List In2 ) → i0 ∷ x₁ ≡ a ++ ( i1 ∷ i0 ∷ i1i0.b li) → List In2 nn18 (i0 ∷ t) eq = t nn19 : (a : List In2 ) → (eq : i0 ∷ x₁ ≡ a ++ ( i1 ∷ i0 ∷ i1i0.b li) ) → x₁ ≡ nn18 a eq ++ i1 ∷ i0 ∷ i1i0.b li nn19 (i0 ∷ a) eq = cons-inject eq nn17 (i1 ∷ x₁) i eq li = nn20 (i1 ∷ x₁) i eq li where + -- second half nn20 : (x : List In2) → (i : ℕ) → inputnn1-i1 i x ≡ true → i1i0 x → ⊥ - nn20 [] zero eq li = nn21 (i1i0.a li) (i1i0.i10 li) where - nn21 : (a : List In2 ) → ¬ ( [] ≡ a ++ i1 ∷ i0 ∷ i1i0.b li ) - nn21 [] () - nn21 (x ∷ a) () - nn20 (i0 ∷ x₁) zero () li - nn20 (i0 ∷ x₁) (suc i) () li - nn20 (i1 ∷ x₁) (suc i) eqa li = nn20 x₁ i eqa record { a = nn18 (i1i0.a li) (i1i0.i10 li) ; b = i1i0.b li - ; i10 = nn19 (i1i0.a li) (i1i0.i10 li) } where - nn18 : (a : List In2 ) → i1 ∷ x₁ ≡ a ++ ( i1 ∷ i0 ∷ i1i0.b li) → List In2 - nn18 [] eqb = ? - nn18 (i1 ∷ t) eq = t - nn19 : (a : List In2 ) → (eq : i1 ∷ x₁ ≡ a ++ ( i1 ∷ i0 ∷ i1i0.b li) ) - → x₁ ≡ nn18 a eq ++ i1 ∷ i0 ∷ i1i0.b li - nn19 (i1 ∷ a) eq = cons-inject eq - nn19 [] eqb = ? + nn20 x i eq li = nn21 (i1i0.a li) x i eq (i1i0.i10 li) where + nn21 : (a x : List In2) → (i : ℕ) → inputnn1-i1 i x ≡ true → x ≡ a ++ i1 ∷ i0 ∷ i1i0.b li → ⊥ + nn21 [] [] zero eq1 () + nn21 (i0 ∷ a) [] zero eq1 () + nn21 (i1 ∷ a) [] zero eq1 () + nn21 a (i0 ∷ x₁) zero () eq0 + nn21 [] (i0 ∷ x₁) (suc i) () eq0 + nn21 (x ∷ a) (i0 ∷ x₁) (suc i) () eq0 + nn21 [] (i1 ∷ i0 ∷ x₁) (suc zero) () eq0 + nn21 [] (i1 ∷ i0 ∷ x₁) (suc (suc i)) () eq0 + nn21 (i1 ∷ a) (i1 ∷ x₁) (suc i) eq1 eq0 = nn21 a x₁ i eq1 (cons-inject eq0) nn11 : (x y z : List In2 ) → ¬ y ≡ [] → inputnn1 (x ++ y ++ z) ≡ true → ¬ ( inputnn1 (x ++ y ++ y ++ z) ≡ true ) - nn11 x y z ny xyz xyyz = ⊥-elim ( nn12 (x ++ y ++ y ++ z ) xyyz record { a = x ++ i1i0.a (bb23 bb22 ) + nn11 x y z ny xyz xyyz = ⊥-elim ( nn12 (x ++ y ++ y ++ z ) xyyz record { a = x ++ i1i0.a (bb23 bb22 ) ; b = i1i0.b (bb23 bb22) ++ z ; i10 = bb24 } ) where + -- + -- we need simple calcuraion to obtain count0 y ≡ count1 y + -- nn21 : count0 x + count0 y + count0 y + count0 z ≡ count1 x + count1 y + count1 y + count1 z nn21 = begin (count0 x + count0 y + count0 y) + count0 z ≡⟨ solve +-0-monoid ⟩ - count0 x + (count0 y + (count0 y + count0 z)) ≡⟨ sym (cong (λ k → count0 x + (count0 y + k)) (cong0 y _ )) ⟩ - count0 x + (count0 y + count0 (y ++ z)) ≡⟨ sym (cong (λ k → count0 x + k) (cong0 y _ )) ⟩ - count0 x + (count0 (y ++ y ++ z)) ≡⟨ sym (cong0 x _ ) ⟩ + count0 x + (count0 y + (count0 y + count0 z)) ≡⟨ sym (cong (λ k → count0 x + (count0 y + k)) (distr0 y _ )) ⟩ + count0 x + (count0 y + count0 (y ++ z)) ≡⟨ sym (cong (λ k → count0 x + k) (distr0 y _ )) ⟩ + count0 x + (count0 (y ++ y ++ z)) ≡⟨ sym (distr0 x _ ) ⟩ count0 (x ++ y ++ y ++ z) ≡⟨ nn15 (x ++ y ++ y ++ z) xyyz ⟩ - count1 (x ++ y ++ y ++ z) ≡⟨ cong1 x _ ⟩ - count1 x + (count1 (y ++ y ++ z)) ≡⟨ cong (λ k → count1 x + k) (cong1 y _ ) ⟩ - count1 x + (count1 y + count1 (y ++ z)) ≡⟨ (cong (λ k → count1 x + (count1 y + k)) (cong1 y _ )) ⟩ + count1 (x ++ y ++ y ++ z) ≡⟨ distr1 x _ ⟩ + count1 x + (count1 (y ++ y ++ z)) ≡⟨ cong (λ k → count1 x + k) (distr1 y _ ) ⟩ + count1 x + (count1 y + count1 (y ++ z)) ≡⟨ (cong (λ k → count1 x + (count1 y + k)) (distr1 y _ )) ⟩ count1 x + (count1 y + (count1 y + count1 z)) ≡⟨ solve +-0-monoid ⟩ count1 x + count1 y + count1 y + count1 z ∎ where open ≡-Reasoning nn20 : count0 x + count0 y + count0 z ≡ count1 x + count1 y + count1 z nn20 = begin count0 x + count0 y + count0 z ≡⟨ solve +-0-monoid ⟩ - count0 x + (count0 y + count0 z) ≡⟨ cong (λ k → count0 x + k) (sym (cong0 y z)) ⟩ - count0 x + (count0 (y ++ z)) ≡⟨ sym (cong0 x _) ⟩ - count0 (x ++ (y ++ z)) ≡⟨ nn15 (x ++ y ++ z) xyz ⟩ - count1 (x ++ (y ++ z)) ≡⟨ cong1 x _ ⟩ - count1 x + count1 (y ++ z) ≡⟨ cong (λ k → count1 x + k) (cong1 y z) ⟩ + count0 x + (count0 y + count0 z) ≡⟨ cong (λ k → count0 x + k) (sym (distr0 y z)) ⟩ + count0 x + (count0 (y ++ z)) ≡⟨ sym (distr0 x _) ⟩ + count0 (x ++ (y ++ z)) ≡⟨ nn15 (x ++ y ++ z) xyz ⟩ + count1 (x ++ (y ++ z)) ≡⟨ distr1 x _ ⟩ + count1 x + count1 (y ++ z) ≡⟨ cong (λ k → count1 x + k) (distr1 y z) ⟩ count1 x + (count1 y + count1 z) ≡⟨ solve +-0-monoid ⟩ count1 x + count1 y + count1 z ∎ where open ≡-Reasoning -- this takes very long time to check and needs 10GB bb22 : count0 y ≡ count1 y - bb22 = ? -- begin --- count0 y ≡⟨ sym ( +-cancelʳ-≡ {count1 z + count0 x + count0 y + count0 z} (count1 y) (count0 y) (+-cancelˡ-≡ (count1 x + count1 y) ( --- begin --- count1 x + count1 y + (count1 y + (count1 z + count0 x + count0 y + count0 z)) ≡⟨ solve +-0-monoid ⟩ --- (count1 x + count1 y + count1 y + count1 z) + (count0 x + count0 y + count0 z) ≡⟨ sym (cong₂ _+_ nn21 (sym nn20)) ⟩ --- (count0 x + count0 y + count0 y + count0 z) + (count1 x + count1 y + count1 z) ≡⟨ +-comm _ (count1 x + count1 y + count1 z) ⟩ --- (count1 x + count1 y + count1 z) + (count0 x + count0 y + count0 y + count0 z) ≡⟨ solve +-0-monoid ⟩ --- count1 x + count1 y + (count1 z + (count0 x + count0 y)) + count0 y + count0 z --- ≡⟨ cong (λ k → count1 x + count1 y + (count1 z + k) + count0 y + count0 z) (+-comm (count0 x) _) ⟩ --- count1 x + count1 y + (count1 z + (count0 y + count0 x)) + count0 y + count0 z ≡⟨ solve +-0-monoid ⟩ --- count1 x + count1 y + ((count1 z + count0 y) + count0 x) + count0 y + count0 z --- ≡⟨ cong (λ k → count1 x + count1 y + (k + count0 x) + count0 y + count0 z ) (+-comm (count1 z) _) ⟩ --- count1 x + count1 y + (count0 y + count1 z + count0 x) + count0 y + count0 z ≡⟨ solve +-0-monoid ⟩ --- count1 x + count1 y + (count0 y + (count1 z + count0 x + count0 y + count0 z)) ∎ ))) ⟩ --- count1 y ∎ where open ≡-Reasoning + bb22 = begin + count0 y ≡⟨ sym ( +-cancelʳ-≡ {count1 z + count0 x + count0 y + count0 z} (count1 y) (count0 y) (+-cancelˡ-≡ (count1 x + count1 y) ( + begin + count1 x + count1 y + (count1 y + (count1 z + count0 x + count0 y + count0 z)) ≡⟨ solve +-0-monoid ⟩ + (count1 x + count1 y + count1 y + count1 z) + (count0 x + count0 y + count0 z) ≡⟨ sym (cong₂ _+_ nn21 (sym nn20)) ⟩ + (count0 x + count0 y + count0 y + count0 z) + (count1 x + count1 y + count1 z) ≡⟨ +-comm _ (count1 x + count1 y + count1 z) ⟩ + (count1 x + count1 y + count1 z) + (count0 x + count0 y + count0 y + count0 z) ≡⟨ solve +-0-monoid ⟩ + count1 x + count1 y + (count1 z + (count0 x + count0 y)) + count0 y + count0 z + ≡⟨ cong (λ k → count1 x + count1 y + (count1 z + k) + count0 y + count0 z) (+-comm (count0 x) _) ⟩ + count1 x + count1 y + (count1 z + (count0 y + count0 x)) + count0 y + count0 z ≡⟨ solve +-0-monoid ⟩ + count1 x + count1 y + ((count1 z + count0 y) + count0 x) + count0 y + count0 z + ≡⟨ cong (λ k → count1 x + count1 y + (k + count0 x) + count0 y + count0 z ) (+-comm (count1 z) _) ⟩ + count1 x + count1 y + (count0 y + count1 z + count0 x) + count0 y + count0 z ≡⟨ solve +-0-monoid ⟩ + count1 x + count1 y + (count0 y + (count1 z + count0 x + count0 y + count0 z)) ∎ ))) ⟩ + count1 y ∎ where open ≡-Reasoning + -- + -- y contains i0 and i1 , so we have i1 → i0 transition in y ++ y + -- bb23 : count0 y ≡ count1 y → i1i0 (y ++ y) bb23 eq = bb25 y y bb26 (subst (λ k → 0 < k ) (sym eq) bb26) where bb26 : 0 < count1 y bb26 with <-cmp 0 (count1 y) ... | tri< a ¬b ¬c = a ... | tri≈ ¬a b ¬c = ⊥-elim (nat-≡< (sym bb27 ) (0