changeset 266:e5cf49902db3

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Wed, 17 Nov 2021 16:12:30 +0900
parents c47634c830f3
children ae70f96cb60c
files a01/lecture.ind a02/agda/data1.agda a02/agda/lambda.agda a02/agda/level1.agda a02/agda/list.agda a02/agda/record1.agda a02/lecture.ind automaton-in-agda/src/automaton-ex.agda automaton-in-agda/src/bijection.agda automaton-in-agda/src/flcagl.agda automaton-in-agda/src/logic.agda automaton-in-agda/src/nat.agda automaton-in-agda/src/regular-language.agda index.ind
diffstat 14 files changed, 394 insertions(+), 424 deletions(-) [+]
line wrap: on
line diff
--- a/a01/lecture.ind	Thu Jul 08 08:41:05 2021 +0900
+++ b/a01/lecture.ind	Wed Nov 17 16:12:30 2021 +0900
@@ -74,6 +74,10 @@
 
 SMVなどのモデル検査系を使えるようにする。
 
+--問題1.1 論文管理と論文検索
+
+
+<a href="../exercise/006.html"> 論文管理 Zotero </a> <!---  Exercise 1.1 --->
 
 
 
--- a/a02/agda/data1.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/a02/agda/data1.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -1,32 +1,77 @@
 module data1 where
 
 data _∨_ (A B : Set) : Set where
-  p1 : A → A ∨ B
-  p2 : B → A ∨ B
+  case1 : A → A ∨ B
+  case2 : B → A ∨ B
 
 ex1 : {A B : Set} → A → ( A ∨ B ) 
-ex1 = {!!}
+ex1  a = case1 a
 
 ex2 : {A B : Set} → B → ( A ∨ B ) 
-ex2 = {!!}
+ex2 = λ b → case2 b
 
 ex3 : {A B : Set} → ( A ∨ A ) → A 
-ex3 = {!!}
+ex3 (case1 x) = x
+ex3 (case2 x) = x
 
 ex4 : {A B C : Set} →  A ∨ ( B ∨ C ) → ( A ∨  B ) ∨ C 
 ex4 = {!!}
 
 record _∧_ A B : Set where
   field
-     π1 : A
-     π2 : B
+     proj1 : A
+     proj2 : B
 
 open _∧_
 
+ex3' : {A B : Set} → ( A ∨ B ) →   A ∧ B   -- this is wrong
+ex3' = {!!}
+
+ex4' : {A B : Set} → ( A ∧ B ) →   A ∨ B   
+ex4' = {!!}
+
 --- ex5 :  {A B C : Set} →  (( A → C ) ∨ ( B  → C ) ) → ( ( A ∨  B ) → C ) is wrong
 ex5 :  {A B C : Set} →  (( A → C ) ∨ ( B  → C ) ) → ( ( A ∧  B ) → C )
 ex5 = {!!}
 
+data ⊥ : Set where
+
+⊥-elim : {A : Set } -> ⊥ -> A
+⊥-elim = {!!}
+
+¬_ : Set → Set
+¬ A = A → ⊥
+
+
+record PetResearch ( Cat Dog Goat Rabbit : Set ) : Set where
+     field
+        fact1 : ( Cat ∨ Dog ) → ¬ Goat
+        fact2 : ¬ Cat →  ( Dog ∨ Rabbit )
+        fact3 : ¬ ( Cat ∨ Goat ) →  Rabbit
+
+postulate
+     lem : (a : Set) → a ∨ ( ¬ a )
+
+module tmp ( Cat Dog Goat Rabbit : Set ) (p :  PetResearch  Cat Dog Goat Rabbit ) where
+
+    open PetResearch
+
+    problem0 : Cat ∨ Dog ∨ Goat ∨ Rabbit
+    problem0 with lem Cat  | lem Goat
+    ... | case1 cat | y = case1 (case1 {!!})
+    ... | case2 x | case1 goat = case1 {!!}
+    ... | case2 ¬cat | case2 ¬goat = case2 (fact3 p lemma1 ) where
+       lemma1 : ¬ (Cat ∨ Goat)
+       lemma1 (case1 cat) = ¬cat cat
+       lemma1 (case2 goat) = {!!}
+
+    problem1 : Goat → ¬ Dog
+    problem1 = {!!}
+ 
+    problem2 : Goat → Rabbit
+    problem2 = {!!}
+
+
 data Three : Set where
   t1 : Three
   t2 : Three
@@ -58,14 +103,6 @@
 ex6 = mul ( suc ( suc zero)) (suc ( suc ( suc zero)) )
 
 
-data ⊥ : Set where
-
-⊥-elim : {A : Set } -> ⊥ -> A
-⊥-elim ()
-
-¬_ : Set → Set
-¬ A = A → ⊥
-
 
 data connected { V : Set } ( E : V -> V -> Set ) ( x y : V ) : Set  where
    direct :   E x y -> connected E x y
--- a/a02/agda/lambda.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/a02/agda/lambda.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -1,35 +1,67 @@
-module lambda ( T : Set) ( t : T ) where
-
+module lambda ( A B : Set) (a : A ) (b : B ) where
 
-A→A : (A : Set ) → ( A → A )
-A→A = λ A → λ ( a : A ) → a
+--   λ-intro 
+--
+--      A
+--   -------- id
+--      A
+--   -------- λ-intro ( =  λ ( x : A ) → x )
+--    A → A 
+
+A→A : A → A 
+A→A = λ ( x : A ) → x
+
+A→A'' : A → A 
+A→A'' = λ x  → x
 
-lemma2 : (A : Set ) →  A → A 
-lemma2 A a = {!!}
+A→A' : A → A 
+A→A' x = x
+
+lemma2 : (A : Set ) →  A → A   --  これは  A → ( A  → A ) とは違う
+lemma2 = {!!}
+
+λ-intro : {A B : Set } → A →  B → ( A → B )  -- {} implicit variable
+λ-intro  _ b = λ _ → b    -- _ anonymous variable
 
-→intro : {A B : Set } → A →  B → ( A → B )
-→intro _ b = λ x → b
+-- λ-intro {A} {B} a b = λ a → b    
 
-→elim : {A B : Set } → A → ( A → B ) → B
+--   λ-elim
+--
+--      A     A → B
+--   ----------------- λ-elim 
+--          B
+
+→elim : A → ( A → B ) → B
 →elim a f = f a 
 
 ex1 : {A B : Set} → Set 
-ex1 {A} {B} = ( A → B ) → A → B
-
-ex1' : {A B : Set} → Set 
-ex1' {A} {B} =  A → B  → A → B
+ex1 {A} {B} = {!!} -- ( A → B ) → A → B
 
 ex2 : {A : Set} → Set 
 ex2 {A}  =  A → ( A  → A )
 
 proof2 : {A : Set } → ex2 {A}
-proof2 = {!!}
+proof2 {A} = {!!} where
+  p1 : {!!}      --- ex2 {A} を C-C C-N する
+  p1 = {!!}
 
-ex3 : {A B : Set} → A → B
+ex3 :  A → B     -- インチキの例
 ex3 a = {!!}
 
-ex4 : {A B : Set} → A → B → B
-ex4 {A}{B} a b  =   {!!}
+ex4 : {A B : Set} → A → (B → B)  -- 仮定を無視してる
+ex4 {A}{B} a b = b
+
+---           [A]₁               not used   --- a
+---         ────────────────────
+---                 [B]₂                    --- b
+---         ──────────────────── (₂)
+---             B → B
+---         ──────────────────── (₁)  λ-intro
+---              A → (B → B) 
+
+
+ex4' :  A → (B → B)   -- インチキできる / 仮定を使える
+ex4'  = {!!}
 
 ex5 : {A B : Set} → A → B → A
 ex5 = {!!}
@@ -37,18 +69,33 @@
 
 
 postulate
-  Domain : Set
-  Range : Set
+  Domain : Set   --  Range Domain : Set
+  Range : Set    -- codomain     Domain → Range, coRange ← coDomain
   r : Range 
 
 ex6 : Domain → Range
 ex6 a = {!!}
 
-ex7 : {A : Set} → A → T
-ex7 a = {!!}
 
-ex11 : (A B : Set) → ( A → B ) → A → B
-ex11 = {!!}
+---                   A → B
+--                     :
+---                   A → B
+---         ─────────────────────────── 
+---              ( A → B ) → A → B
+---
+---              [A]₁     [A → B ]₂
+---         ───────────────────────────  λ-elim
+---                    B
+---         ───────────────────────────  ₁
+---                   A → B
+---         ───────────────────────────  ₂
+---              ( A → B ) → A → B
+
+--
+--  上の二つの図式に対応する二つの証明に対応するラムダ項がある
+--
+ex11 : ( A → B ) → A → B
+ex11  = {!!}
 
 ex12 : (A B : Set) → ( A → B ) → A → B
 ex12 = {!!}
--- a/a02/agda/level1.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/a02/agda/level1.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -8,6 +8,9 @@
 ex2 : { A B : Set} →  ( A → B ) → Set
 ex2 {A} {B}  A→B  =  ex1 {A} {B}
 
+ex7 : {A B : Set} → Set _
+ex7 {A} {B} = lemma2 ( A → B ) _ -- → A → B
+
 
 -- record FuncBad (A B : Set) : Set where
 --   field
--- a/a02/agda/list.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/a02/agda/list.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -10,16 +10,21 @@
 infixr 40 _::_
 data  List  (A : Set ) : Set  where
    [] : List A
-   _::_ : A → List A → List A
+   _::_ : A →  List A → List A 
 
+--
+--                           A      List A
+--     -------------- []    ---------------- _::_
+--         List A               List A
+--
 
 infixl 30 _++_
 _++_ :   {A : Set } → List A → List A → List A
-[]        ++ ys = ys
-(x :: xs) ++ ys = x :: (xs ++ ys)
+[] ++ y = y
+(x :: x₁) ++ y = x :: (x₁ ++ y )
 
 l1 = a :: []
-l2 = a :: b :: a :: c ::  []
+l2 = a :: b  :: a :: c ::  []
 
 l3 = l1 ++ l2
 
@@ -58,9 +63,55 @@
     (x :: xs) ++ (ys ++ zs)

 
-open import Data.Nat
+-- open import Data.Nat
+
+data Nat : Set where
+  zero : Nat 
+  suc  : Nat → Nat
+
+_+_ : Nat → Nat → Nat
+zero + y = y
+suc x + y = suc (x + y)
+
+sym1 : {A : Set} → {a b : A} → a ≡ b → b ≡ a
+sym1 {_} {a} {.a} refl = refl
+
+trans1 : {A : Set} → {a b c : A} → a ≡ b → b ≡ c → a ≡ c
+trans1 {_} {a} {b} {.a} refl refl = refl
+
+cong1 : {A B : Set} → {a b : A} → (f : A → B) → a ≡ b → f a ≡ f b 
+cong1 f refl = refl
+
+induction : (P : (x : Nat) → Set) → (initial : P zero ) → (induction-setp : ((x : Nat) → P x → P (suc x))) → (x : Nat) → P x
+induction P initial induction-setp zero = initial
+induction P initial induction-setp (suc x) =  induction-setp x ( induction P initial induction-setp x)
 
-length : {L : Set} → List L →  ℕ
+induction' : (P : (x : Nat) → Set) → (initial : P zero ) → (induction-setp : ((x : Nat) → P x → P (suc x))) → (x : Nat) → P x
+induction' P initial induction-setp x = {!!} where
+    ind1 : {!!} → P x
+    ind1 = {!!}
+
++-comm : {x y : Nat} → x + y ≡ y + x
++-comm {zero} {y} = sym1 lemma01  where
+   lemma01 : {y : Nat} → y + zero ≡ y
+   lemma01 {zero} = refl                               --      (zero + zero ) → zero → zero + zero ≡ zero
+   lemma01 {suc y} = cong1 (λ x → suc x) (lemma01 {y}) ---  (suc y + zero) ≡ suc y
+                               --   suc (y + zero) ≡ suc y  ← y + zero ≡ y 
++-comm {suc x} {y} = {!!}
+
+_*_ : Nat → Nat → Nat
+zero * y = zero
+suc x * y = y + (x * y)
+
+--
+--     * * *    * *
+--     * * *  ≡ * *
+--              * *
+
+*-comm : {x y : Nat} → x * y ≡ y * x
+*-comm = {!!}
+
+length : {L : Set} → List L →  Nat
 length [] = zero
 length (_ :: T ) = suc ( length T )
 
@@ -69,8 +120,8 @@
 lemma [] (_ :: _) = refl
 lemma (H :: T) L =  let open  ≡-Reasoning in
   begin 
-     ?
-  ≡⟨ ? ⟩
-     ?
+     {!!}
+  ≡⟨ {!!} ⟩
+     {!!}

 
--- a/a02/agda/record1.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/a02/agda/record1.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -5,10 +5,19 @@
      π1 : A
      π2 : B
 
+ex0 : {A B : Set} → A ∧ B →  A
+ex0 =  _∧_.π1 
+
+ex1 : {A B : Set} → ( A ∧ B ) → A 
+ex1 a∧b =  _∧_.π1 a∧b
+
 open _∧_
 
-ex1 : {A B : Set} → ( A ∧ B ) → A 
-ex1 a∧b = {!!}
+ex0' : {A B : Set} → A ∧ B →  A
+ex0' =  π1 
+
+ex1' : {A B : Set} → ( A ∧ B ) → A 
+ex1' a∧b =  π1 a∧b
 
 ex2 : {A B : Set} → ( A ∧ B ) → B 
 ex2 a∧b = {!!}
@@ -22,6 +31,22 @@
 ex5 : {A B C : Set} → ( A ∧ B ) ∧ C  →  A ∧ (B ∧ C) 
 ex5 a∧b∧c = record { π1 = {!!} ; π2 = {!!} }
 
+--
+--                                 [(A → B ) ∧ ( B →  C) ]₁  
+--                                ──────────────────────────────────── π1
+--     [(A → B ) ∧ ( B →  C) ]₁        (A → B )    [A]₂
+--   ──────────────────────────── π2 ─────────────────────── λ-elim
+--          ( B →  C)                     B
+--   ─────────────────────────────────────────── λ-elim
+--                   C
+--   ─────────────────────────────────────────── λ-intro₂
+--                 A → C
+--   ─────────────────────────────────────────── λ-intro₁
+--     ( (A → B ) ∧ ( B →  C) )  → A → C
+
 ex6 : {A B C : Set} → ( (A → B ) ∧ ( B →  C) )  → A → C
-ex6  =  {!!}
+ex6 x a = {!!}
 
+ex6' : {A B C : Set} →  (A → B ) → ( B →  C)   → A → C
+ex6' = {!!}
+
--- a/a02/lecture.ind	Thu Jul 08 08:41:05 2021 +0900
+++ b/a02/lecture.ind	Wed Nov 17 16:12:30 2021 +0900
@@ -70,7 +70,7 @@
 
 --関数適用による証明
 
-導入                          除去
+     導入                          除去
 
        A                   
        :
@@ -117,6 +117,20 @@
 
 <a href="agda.html"> agda の細かい構文の話 </a> 
 
+Unicode入力
+
+<a href="https://agda.readthedocs.io/en/v2.6.0.1/tools/emacs-mode.html"> Unicode入力 </a>
+
+--重要
+
+    空白が入らないものは一単語になる (A→A は一単語、A → A とは別)
+
+    A:Set は間違いで、A : Set
+
+    A → B → C は、 A → ( B → C )  のこと
+
+  f x y は (f x) y のこと
+
 
 ---問題2.1 Agdaによる関数と証明
 
@@ -128,7 +142,7 @@
 
 --record または ∧
 
-導入                          除去
+     導入                          除去
 
      A    B                 A ∧ B           A ∧ B 
    -------------         ----------- π1   ---------- π2
@@ -268,343 +282,10 @@
 
 最低限5題をまとめてレポートで提出せよ
 
-<a href="agda/practice-logic.agda"> practice-logic</a> <!---  Exercise 2.2 --->
-
-
-
---data または 排他的論理和(Sum)
-
-ここで扱っている論理(直観主義論理)では∧に対称的な形で∨を定義することはしない。導入は対称的になるが除去はおかしくなってしまう。
-そこで次のように定義することになっている。
-
-除去                           導入
-               A      B
-               :      :
-      A ∨ B    C      C            A               B
-   ------------------------  ----------- case1 ---------- case2
-           C                     A ∨ B           A ∨ B 
-
-
-    data _∨_ (A B : Set) : Set where
-      case1 : A → A ∨ B
-      case2 : B → A ∨ B
-
-dataはCで言えばcase文とunion に相当する。Scala のCase Classもこれである。Cと違いunionにはどの型が入っているかを区別するtagが付いている。
-
-case1 と case2 は A ∨ B を構成する constructor (推論ではintroduction)であり、case 文が eliminator に相当する。
-
-Haskellと同様にp1/p2はパターンマッチで場合分けする。
-
-    ex3 : {A B : Set} → ( A ∨ A ) → A 
-    ex3 = ?
-
-場合分けには、? の部分にcursolを合わせて C-C C-C すると場合分けを生成してくれる。
-
-    ex3 : {A B : Set} → ( A ∨ A ) → A 
-    ex3 (case1 x) = ?
-    ex3 (case2 x) = ?
-
-
----問題2.3 Agdaのdata
-
-
-<a href="agda/data1.agda"> data </a> <!---  Exercise 2.3 --->
-
---有限な集合と Nat 
-
-data は有限な要素を持つ集合を構成できる。
-
-    data Three : Set where
-      t1 : Three
-      t2 : Three
-      t3 : Three
-
-    open Three
-
-    data 3Ring : (dom cod : Three) → Set where
-       r1 : 3Ring t1 t2
-       r2 : 3Ring t2 t3
-       r3 : 3Ring t3 t1
-
-これは、三つのVertexとEdgeを持つグラフをdataで表してみたものである。
-
-任意の個数を表すためには自然数(Natural Number)を作る必要がある。ペアノの公理が有名だが、dataを使って以下のように構成する。
-
-    data Nat : Set where
-      zero : Nat
-      suc  : Nat →  Nat
-
-    add : ( a b : Nat ) → Nat
-    add zero x = x
-    add (suc x) y = suc ( add x y )
-
-    mul : ( a b : Nat ) → Nat
-    mul zero x = ?
-    mul (suc x) y = ?
-
---問題2.4 Nat 
-
-? を埋めて掛け算を完成させよう。
-
-<a href="agda/practice-nat.agda"> data </a> <!---  Exercise 2.4 --->
+<a href="agda/record1.agda"> record1</a> <!---  Exercise 2.2 --->
 
---Equality
-
-自然数を導入したので方程式を記述したい。そのためには等式を導入する必要がある。導入は
-
-   ---------------
-      x == x
-
-だが、ここには隠れた仮定がある。x は何かの集合の要素なはず。
-
-     { x : A }
-   ---------------
-      x == x
-
-さらに左辺と右辺は等しいが、
-
-     add zero zero == zero
-
-では左辺と右辺は項として同じではない。計算して同じということにして欲しい。つまり、
-
-  Agdaの項には計算していくと決まった形に落ちる
-
-という性質があって欲しい。この計算はλ項に対して定義する必要がある。この計算をreduction(縮約)、
-決まった形をnormal form(正規形)と言う。
-
-<a href="reduction.html">Reduction</a>
-
-Agda での定義は以下のようになる。
-
-    data _==_ {A : Set } : A → A → Set where
-       refl :  {x : A} → x == x
-
-refl は reflection (反映) の略である。refl は 等式のconstructorになる。
-
-Elmination は変数の置き換えになる。
-
-      x == y    f x y
-   ------------------------
-          f x x
+--Sum type
 
-x == y は入力の型であり、refl とうパターンでしか受けられない。この時に、x と y が等しい必要がある。
-
-しかし、x と y は項なので変数を含むことがある。Agda に等しいことを確信させる必要がある。
-この問題はパターンマッチの時にもすででていた。これは項(正規化された)を再帰的に比較していく
-手順が必要になる。これは単一化(Unification)と呼ばれる。
-
-<a href="unification.html">Unification</a>
-
-    ex1 : {A : Set} {x : A } → x == x
-    ex1  = ?
-
-    ex2 : {A : Set} {x y : A } → x == y → y == x
-    ex2 = ?
-
-    ex3 : {A : Set} {x y z : A } → x == y → y == z → x == z
-    ex3 = ?
-
-    ex4 : {A B : Set} {x y : A } { f : A → B } →   x == y → f x == f y
-    ex4 = ?
-
---問題 2.4
-
-以上の証明を refl を使って完成させてみよう。
-
-<a href="agda/equality.agda"> equality </a> <!---  Exercise 2.4 --->
-
---問題 2.5
-
-<a href="agda/practice-nat.agda"> nat の例題 </a> <!---  Exercise 2.5 --->
-
---集合のLevel 
-
-論理式は型であり、それは基本的はSetになっている。例えば、A → B は Set である。
-
-    ex1 : { A B : Set} → Set
-    ex1 {A} {B} =  A → B
-
-Agda は高階論理なので、論理式自体を返す論理式も作ることができる。
-
-    ex2 : { A B : Set} →  ( A → B ) → Set
-    ex2 {A} {B}  A→B  =  ex1 {A} {B}
+<a href="sumtype.html"> Sum type 排他的論理和</a> 
 
 
-では、これを論理式を要素として持つ直積を作ってみよう。
-
-    record FuncBad (A B : Set) : Set where
-      field
-         func : A → B → Set
-
-Agda は以下のように文句をいう。
-
-    The type of the constructor does not fit in the sort of the
-    datatype, since Set₁ is not less or equal than Set
-    when checking the definition of FuncBad
-
-自己参照的な集合の定義を避けるために集合には階(level)という概念が導入されている。
-
-    open import Level
-    record Func {n : Level} (A B : Set n ) : Set (suc n) where
-      field
-        func : A → B → Set n
-
-のように集合の階(Level)を明示する必要がある。
-
---問題1.5 集合のLevel 
-
-level が合うように ? を埋めよ。
-
-<a href="agda/level1.agda"> level </a> <!---  Exercise 2.5 --->
-
---List
-
-List は cons か nil かどちらかの構造で、cons は List を再帰的に含んでいる。
-
-    postulate A : Set
-
-    postulate a : A
-    postulate b : A
-    postulate c : A
-
-
-    infixr 40 _::_
-    data  List  (A : Set ) : Set  where
-       [] : List A
-       _::_ : A → List A → List A
-
-
-    infixl 30 _++_
-    _++_ :   {A : Set } → List A → List A → List A
-    []        ++ ys = ys
-    (x :: xs) ++ ys = x :: (xs ++ ys)
-
-    l1 = a :: []
-    l2 = a :: b :: a :: c ::  []
-
-    l3 = l1 ++ l2
-
-等式の変形を利用して、List の結合法則を証明してみよう。
-
-    open  import  Relation.Binary.PropositionalEquality
-
-    ++-assoc :  (L : Set ) ( xs ys zs : List L ) → (xs ++ ys) ++ zs  ≡ xs ++ (ys ++ zs)
-    ++-assoc A [] ys zs = let open ≡-Reasoning in
-      begin -- to prove ([] ++ ys) ++ zs  ≡ [] ++ (ys ++ zs)
-       ( [] ++ ys ) ++ zs
-      ≡⟨ refl ⟩
-        ys ++ zs
-      ≡⟨⟩
-        [] ++ ( ys ++ zs )
-      ∎
-    ++-assoc A (x :: xs) ys zs = let open  ≡-Reasoning in ?
-
-≡⟨⟩ などの定義はどこにあるのか?
-
---問題2.6 List
-
-lemma を等式の変形を利用して証明してみよ。
-
-<a href="agda/list.agda"> List </a> <!---  Exercise 2.6 --->
-
---DAGと否定
-
-グラフには接続されてない二点が存在する。それを表現するために否定¬と矛盾⊥を導入する。
-
-       ⊥
-    ------------- ⊥-elim
-       A
-
-矛盾からは何でも導くことができる。この場合、A はSetである。⊥ を導入する推論規則はない。
-
-これは、contructor のない data で表すことができる。
-
-    data ⊥ : Set where
-
-⊥-elim は以下のように証明できる。
-
-    ⊥-elim : {A : Set } -> ⊥ -> A
-    ⊥-elim ()
-
-() は「何にもmatchしないパターン」である。これは型を指定した時に「可能な入力がない」必要がある。つまり、このケースは起こり得ない
-ことを Agda が納得する必要がある。納得できないと error message がでる。
-
-    λ ()
-
-という構文も存在する。
-
-⊥ を使って否定は以下のように定義される。
-
-    ¬_ : Set → Set
-    ¬ A = A → ⊥
-
-否定には入力があることを意識しておこう。
-
-         f0
-      -----→
-   t0         t1
-      -----→
-         f1
-
-というグラフは以下のように記述する。
-
-    data  TwoObject   : Set  where
-           t0 : TwoObject
-           t1 : TwoObject
-
-
-    data TwoArrow  : TwoObject → TwoObject → Set  where
-           f0 :  TwoArrow t0 t1
-           f1 :  TwoArrow t0 t1
-
-ループのあるグラフを作ってみよう。
-
-         r0
-       -----→
-    t0         t1
-       ←-----
-         r1
-
-    data Circle  : TwoObject → TwoObject → Set  where
-           r0 :  Circle t0 t1
-           r1 :  Circle t1 t0
-
-矢印をたどって繋がっている点は接続(connected)されていると言う。
-
-    data connected { V : Set } ( E : V -> V -> Set ) ( x y : V ) : Set  where
-        direct :   E x y -> connected E x y
-        indirect :  { z : V  } -> E x z  ->  connected {V} E z y -> connected E x y
-
-直接繋がっているか、間接的に繋がっているかどちからになる。この構造は自然数に似ている。
-
-t0 と t1 が TwoArrow の場合に繋がっていることを証明してみる。
-
-    lemma1 : connected TwoArrow t0 t1
-    lemma1 =  ?
-
-t1 から t0 にはいけない。
-
-    lemma2 : ¬ ( connected TwoArrow t1 t0 )
-    lemma2  = ?
-
-dag (Directed Acyclic Graph) は、すべての点(Vertex)で自分自身につながる経路(Edge)がないグラフ
-
-    dag :  { V : Set } ( E : V -> V -> Set ) ->  Set
-    dag {V} E =  ∀ (n : V)  →  ¬ ( connected E n n )
-
---問題2.7 DAGと否定
-
-TwoArrow が dag で、Circle が dag ではないことを証明してみよう。
-
-    lemma4 : dag TwoArrow
-    lemma4 = ?
-
-    lemma5 :  ¬ ( dag Circle )
-    lemma5 = ?
-
-<a href="agda/dag.agda"> DAG </a> <!---  Exercise 2.7 --->
-
---教科書の第一章
-
-<a href="../agda/chap0.agda"> chapter 0 </a> 
-
--- a/automaton-in-agda/src/automaton-ex.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/automaton-in-agda/src/automaton-ex.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -4,6 +4,7 @@
 open import Data.List
 open import Data.Maybe
 open import Relation.Binary.PropositionalEquality hiding ( [_] )
+open import Relation.Binary.Definitions
 open import Relation.Nullary using (¬_; Dec; yes; no)
 open import logic
 
@@ -18,7 +19,8 @@
 data  In2   : Set  where
    i0 : In2
    i1 : In2
-transitionQ : StatesQ  → In2 → StatesQ
+
+transitionQ : StatesQ → In2 → StatesQ
 transitionQ q1 i0 = q1
 transitionQ q1 i1 = q2
 transitionQ q2 i0 = q3
@@ -39,6 +41,7 @@
 test1 : accept a1 q1 ( i0 ∷ i1 ∷ i0 ∷ [] ) ≡ false
 test1 = refl
 test2 = accept a1 q1 ( i0 ∷ i1 ∷ i0 ∷ i1 ∷ [] ) 
+test3 = trace a1 q1 ( i0 ∷ i1 ∷ i0 ∷ i1 ∷ [] ) 
 
 data  States1   : Set  where
    sr : States1
@@ -68,9 +71,70 @@
 
 example1-3 = reachable am1 sr st ( i1  ∷ i1  ∷ i1  ∷ [] )
 
+-- data Dec' (A : Set)  : Set where
+--    yes' :   A → Dec' A
+--    no'  : ¬ A → Dec' A
+-- 
+-- ieq' : (i i' : In2 ) → Dec' ( i ≡ i' )
+-- ieq' i0 i0 = yes' refl
+-- ieq' i1 i1 = yes' refl
+-- ieq' i0 i1 = no' ( λ () )
+-- ieq' i1 i0 = no' ( λ () )
+
 ieq : (i i' : In2 ) → Dec ( i ≡ i' )
 ieq i0 i0 = yes refl
 ieq i1 i1 = yes refl
 ieq i0 i1 = no ( λ () )
 ieq i1 i0 = no ( λ () )
 
+-- p.83 problem 1.4
+--
+-- w has at least three i0's and at least two i1's
+
+count-chars : List In2 → In2 → ℕ
+count-chars [] _ = 0
+count-chars (h ∷ t) x with ieq h x
+... | yes y = suc ( count-chars t x )
+... | no  n = count-chars t x 
+
+test11 : count-chars (  i1  ∷ i1  ∷ i0  ∷ []  ) i0 ≡ 1
+test11 = refl
+
+ex1_4a : (x : List In2) → Bool
+ex1_4a x =  ( count-chars x i0 ≥b 3 ) /\ ( count-chars x i1 ≥b 2 )
+
+language' : { Σ : Set } → Set
+language' {Σ} = List Σ → Bool
+
+lang14a :  language' {In2}
+lang14a = ex1_4a
+
+open _∧_
+
+am14a-tr :  ℕ ∧ ℕ → In2 → ℕ ∧ ℕ
+am14a-tr p i0 = record { proj1 = suc (proj1 p) ; proj2 = proj2 p }
+am14a-tr p i1 = record { proj1 = proj1 p ; proj2 = suc (proj2 p) }
+
+am14a  :  Automaton  (ℕ ∧ ℕ)  In2
+am14a  =  record {  δ = am14a-tr ; aend = λ x → ( proj1 x ≥b 3 ) /\ ( proj2 x ≥b 2 )}
+
+data am14s : Set where
+  a00 : am14s
+  a10 : am14s
+  a20 : am14s
+  a30 : am14s
+  a01 : am14s
+  a11 : am14s
+  a21 : am14s
+  a31 : am14s
+  a02 : am14s
+  a12 : am14s
+  a22 : am14s
+  a32 : am14s
+
+am14a-tr' :  am14s  → In2 → am14s
+am14a-tr' a00 i0 = a10
+am14a-tr' _ _ = a10
+
+am14a'  :  Automaton  am14s  In2
+am14a'  =  record {  δ = am14a-tr' ; aend = λ x → {!!} }
--- a/automaton-in-agda/src/bijection.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/automaton-in-agda/src/bijection.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -98,13 +98,10 @@
 
 open _∧_
 
-record NN ( i  : ℕ) (nxn→n :  ℕ →  ℕ → ℕ) (n→nxn : ℕ → ℕ ∧ ℕ) : Set where
+record NN ( i  : ℕ) (nxn→n :  ℕ →  ℕ → ℕ)  : Set where
   field
-     j k sum stage : ℕ
-     nn : j + k ≡ sum
-     ni : i ≡ j + stage   -- not used
+     j k : ℕ
      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
@@ -123,11 +120,11 @@
      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))
+     nn : ( i  : ℕ) → NN i nxn→n 
      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 ⟫
+     n→nxn n = ⟪ NN.j (nn n)  , NN.k (nn n) ⟫
+     k0 : {i : ℕ } → n→nxn i ≡ ⟪ NN.j (nn i) , NN.k (nn i) ⟫ 
+     k0 {i} = refl
 
      nxn→n0 : { j k : ℕ } →  nxn→n j k ≡ 0 → ( j ≡ 0 ) ∧ ( k ≡ 0 )
      nxn→n0 {zero} {zero} eq = ⟪ refl , refl ⟫
@@ -191,56 +188,64 @@
         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
 
+     nni>j : {i : ℕ}  → suc i > NN.j (nn i)
      -----
      --
      -- 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))
+     ... | zero | record { eq = eq } = record { k = suc (sum ) ; j = 0 ; sum = suc  (sum ) ; stage = suc  (sum ) + (stage )
          ; 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)
+            sum = NN.j (nn i) + NN.k (nn i)
+            stage = minus i (NN.j (nn i))
             j = NN.j (nn i)
+            NNnn :  NN.j (nn i) + NN.k (nn i) ≡ sum
+            NNnn = sym refl
+            NNni : i ≡ NN.j (nn i) + stage   
+            NNni = begin
+               i ≡⟨ sym (minus+n {i} {NN.j (nn i)} (nni>j {i}  )) ⟩
+               stage + NN.j (nn i)  ≡⟨ +-comm stage _ ⟩
+               NN.j (nn i) + stage ∎   where open ≡-Reasoning 
             nn01 : suc i ≡ 0 + (suc sum + stage )
             nn01 = begin
-               suc i ≡⟨ cong suc (NN.ni (nn i)) ⟩
+               suc i ≡⟨ cong suc (NNni ) ⟩
                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)) ⟩
+               suc ((NN.j (nn i) + NN.k  (nn i)) + stage )  ≡⟨ cong (λ k → suc ( k + stage )) (NNnn ) ⟩
                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 sum 0) ≡⟨ cong (λ k → suc (nxn→n k 0 )) (sym (NNnn )) ⟩
                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 :  n→nxn (suc i) ≡ ⟪ 0 , suc (sum ) ⟫   -- 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 (proj1 (n→nxn i)) ⟫ ≡⟨ cong (λ k →  ⟪ zero , suc k ⟫) (cong proj1 refl) ⟩
                 ⟪ 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))  ⟩
+                ⟪ zero , suc (NN.j (nn i) + NN.k (nn i)) ⟫ ≡⟨ cong (λ k →  ⟪ zero , suc k ⟫ ) (NNnn )  ⟩
                 ⟪ 0 , suc sum  ⟫  ∎  where open ≡-Reasoning
-            ... | ⟪ x , suc y ⟫ | record { eq = eq1 } = ⊥-elim ( nat-≡< (sym (cong proj2 (NN.k0 (nn i)))) (begin
+            ... | ⟪ x , suc y ⟫ | record { eq = eq1 } = ⊥-elim ( nat-≡< (sym (cong proj2 refl)) (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 : {j0 k0 : ℕ} → nxn→n j0 k0 ≡ suc i → ⟪ 0 , suc (sum ) ⟫ ≡ ⟪ 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
@@ -252,7 +257,7 @@
                   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) ⟩
+                  NN.j (nn i) + NN.k (nn i)  ≡⟨ NNnn  ⟩
                   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
@@ -264,18 +269,28 @@
                   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
+     ... | suc k  | record {eq = eq} = record { k = k ; j = suc (NN.j (nn i)) ; sum = sum  ; stage = stage  ; nn = nn10
+         ; ni = cong suc (NNni (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)
+            sum = NN.j (nn i) + NN.k (nn i)
+            stage = minus i (NN.j (nn i))
+            j = NN.j (nn i)
+            NNnn :  NN.j (nn i) + NN.k (nn i) ≡ sum
+            NNnn = sym refl
+            NNni : i ≡ NN.j (nn i) + stage   
+            NNni = begin
+               i ≡⟨ sym (minus+n {i} {NN.j (nn i)} (nni>j {i}  )) ⟩
+               stage + NN.j (nn i)  ≡⟨ +-comm stage _ ⟩
+               NN.j (nn i) + stage ∎   where open ≡-Reasoning 
+            nn10 : suc (NN.j (nn i)) + k ≡ sum 
             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 
+                NN.j (nn i) + NN.k (nn i) ≡⟨ NNnn  ⟩
+                sum   ∎   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) ⟩
@@ -291,13 +306,14 @@
             ... | ⟪ 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)) ) ⟩
+                    NN.k (nn i) ≡⟨ cong proj2 (sym refl ) ⟩
                     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) ⟩
+                   n→nxn i ≡⟨ refl ⟩
                    ⟪ 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 
@@ -320,13 +336,21 @@
                 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))
+     n-id i = subst (λ k →  nxn→n (proj1 k) (proj2 k)  ≡ i ) (sym refl) (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))   ⟩
+          n→nxn (nxn→n j k)  ≡⟨ refl ⟩
           ⟪ 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
+     nni>j {zero}  = refl-≤
+     nni>j {suc i}  = {!!}
+     -- nni>j {i} {n} = begin
+     --      suc (NN.j n)  ≤⟨ {!!} ⟩
+     --      suc (nxn→n (NN.j n) (NN.k n)) ≡⟨ {!!} ⟩
+     --      suc i ∎ where
+     --         open ≤-Reasoning
+
 
 
 --   []     0
--- a/automaton-in-agda/src/flcagl.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/automaton-in-agda/src/flcagl.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -1,3 +1,4 @@
+{-# OPTIONS --sized-types #-}
 open import Relation.Nullary
 open import Relation.Binary.PropositionalEquality
 module flcagl
@@ -118,7 +119,8 @@
         Setoid._≈_ (Bis i) = _≅⟨ i ⟩≅_
         Setoid.isEquivalence (Bis i) = ≅isEquivalence i
 
-        import Relation.Binary.EqReasoning as EqR
+        -- import Relation.Binary.EqReasoning as EqR
+        import Relation.Binary.Reasoning.Setoid as EqR
 
         ≅trans′ : ∀ i (k l m : Lang ∞)
            ( p : k ≅⟨ i ⟩≅ l ) ( q : l ≅⟨ i ⟩≅ m ) → k ≅⟨ i ⟩≅ m
@@ -402,7 +404,8 @@
 δ (composeA da1 s2 da2) (s1 , ss2) a =
         δ da1 s1 a , δs da2 (if ν da1 s1 then s2 ∷ ss2 else ss2) a
 
-import Relation.Binary.EqReasoning as EqR
+-- import Relation.Binary.EqReasoning as EqR
+import Relation.Binary.Reasoning.Setoid as EqR
 
 composeA-gen : ∀{i S1 S2} (da1 : DA S1) (da2 : DA S2) → ∀(s1 : S1)(s2 : S2)(ss : List ∞ S2) →
         lang (composeA da1 s2 da2) (s1 , ss) ≅⟨ i ⟩≅ lang da1 s1 · lang da2 s2 ∪ lang (powA da2) ss
--- a/automaton-in-agda/src/logic.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/automaton-in-agda/src/logic.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -170,3 +170,23 @@
 bool-and-2 {false} {false} refl = refl
 
 
+open import Data.Nat
+open import Data.Nat.Properties
+
+_≥b_ : ( x y : ℕ) → Bool
+x ≥b y with <-cmp x y
+... | tri< a ¬b ¬c = false
+... | tri≈ ¬a b ¬c = true
+... | tri> ¬a ¬b c = true
+
+_>b_ : ( x y : ℕ) → Bool
+x >b y with <-cmp x y
+... | tri< a ¬b ¬c = false
+... | tri≈ ¬a b ¬c = false
+... | tri> ¬a ¬b c = true
+
+_≤b_ : ( x y : ℕ) → Bool
+x ≤b y  = y ≥b x
+
+_<b_ : ( x y : ℕ) → Bool
+x <b y  = y >b x
--- a/automaton-in-agda/src/nat.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/automaton-in-agda/src/nat.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -439,7 +439,7 @@
 ... | tri≈ ¬a b ¬c = Finduction.fzero I (sym b) 
 ... | tri< lt _ _ = f-induction0 p (f p) (<to≤ (Finduction.decline I lt)) where 
    f-induction0 : (p : P) → (x : ℕ) → (f (Finduction.pnext I p)) ≤ x → Q p
-   f-induction0 p zero le = Finduction.ind I (Finduction.fzero I (fi0 _ le)) where
+   f-induction0 p zero le = Finduction.ind I (Finduction.fzero I (fi0 _ le)) 
    f-induction0 p (suc x) le with <-cmp (f (Finduction.pnext I p)) (suc x)
    ... | tri< (s≤s a) ¬b ¬c = f-induction0 p x a 
    ... | tri≈ ¬a b ¬c = Finduction.ind I (f-induction0 (Finduction.pnext I p) x (y<sx→y≤x f1)) where
--- a/automaton-in-agda/src/regular-language.agda	Thu Jul 08 08:41:05 2021 +0900
+++ b/automaton-in-agda/src/regular-language.agda	Wed Nov 17 16:12:30 2021 +0900
@@ -44,7 +44,8 @@
 
 {-# TERMINATING #-}
 Star : {Σ : Set} → ( A : language {Σ} ) → language {Σ}
-Star {Σ} A = split A ( Star {Σ} A )
+Star {Σ} A [] = true
+Star {Σ} A (h ∷ t) = split A ( Star {Σ} A ) (h ∷ t)
 
 open import automaton-ex
 
@@ -56,6 +57,9 @@
    )
 test-AB→split {_} {A} {B} = refl
 
+star-nil : {Σ : Set} → ( A : language {Σ} ) → Star A [] ≡ true
+star-nil A = refl
+
 open RegularLanguage 
 isRegular : {Σ : Set} → (A : language {Σ} ) → ( x : List Σ ) → (r : RegularLanguage Σ ) → Set
 isRegular A x r = A x ≡ contain r x 
--- a/index.ind	Thu Jul 08 08:41:05 2021 +0900
+++ b/index.ind	Wed Nov 17 16:12:30 2021 +0900
@@ -47,6 +47,7 @@
 <ol>
 <li><a href="a01/lecture.html"> オートマトンの概要</a>
 <li><a href="a02/lecture.html"> Agdaによる数学的構造の定義と証明</a>
+<li><a href="a02/sumtype.html"> Sum type または data </a>
 <li><a href="a03/lecture.html"> 決定性オートマトン</a> 
 <li><a href="a04/lecture.html"> 非決定性オートマトン </a>
 <li><a href="a05/lecture.html"> 正規表現</a> 
@@ -66,3 +67,9 @@
     Subject: Automaton Lecture Exercise 1.1
 kono@ie.u-ryukyu.ac.jp まで送ること。
 
+--Zotero
+
+論文管理用のソフトウェア
+
+https://www.zotero.org
+