Mercurial > hg > Members > kono > Proof > automaton
changeset 24:9406c2571fe7
naccept1
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 05 Nov 2018 07:53:48 +0900 |
parents | 0c3054704de7 |
children | 256b7a6de863 |
files | agda/automaton.agda agda/nfa-list.agda agda/omega-automaton.agda agda/regop.agda index.ind |
diffstat | 5 files changed, 180 insertions(+), 144 deletions(-) [+] |
line wrap: on
line diff
--- a/agda/automaton.agda Mon Sep 17 20:43:59 2018 +0900 +++ b/agda/automaton.agda Mon Nov 05 07:53:48 2018 +0900 @@ -1,10 +1,10 @@ module automaton where -open import Level renaming ( suc to succ ; zero to Zero ) +-- open import Level renaming ( suc to succ ; zero to Zero ) open import Data.Nat open import Data.List open import Data.Maybe -open import Data.Bool using ( Bool ; true ; false ) +open import Data.Bool using ( Bool ; true ; false ; _∧_ ) open import Relation.Binary.PropositionalEquality hiding ( [_] ) open import Relation.Nullary using (¬_; Dec; yes; no) @@ -26,13 +26,6 @@ i0 : In2 i1 : In2 - -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 ( λ () ) - moves : { Q : Set } { Σ : Set } → Automaton Q Σ → Q → List Σ → Q @@ -40,7 +33,7 @@ where move : (q : Q ) ( L : List Σ ) → Q move q [] = q - move q ( H ∷ T ) = move ( (δ M) q H ) T + move q ( H ∷ T ) = move ( δ M q H) T accept : { Q : Set } { Σ : Set } → Automaton Q Σ @@ -61,7 +54,8 @@ fin1 : States1 → Bool fin1 st = true -fin1 _ = false +fin1 ss = false +fin1 sr = false am1 : Automaton States1 In2 am1 = record { δ = transition1 ; astart = sr ; aend = fin1 } @@ -78,67 +72,9 @@ example1-3 = reachable am1 st ( i1 ∷ i1 ∷ i1 ∷ [] ) -s1id : States1 → ℕ -s1id sr = 0 -s1id ss = 1 -s1id st = 2 - -record NAutomaton ( Q : Set ) ( Σ : Set ) - : Set where - field - nδ : Q → Σ → List Q - sid : Q → ℕ - nstart : Q - nend : Q → Bool - -open NAutomaton - -insert : { Q : Set } { Σ : Set } → ( NAutomaton Q Σ ) → List Q → Q → List Q -insert M [] q = q ∷ [] -insert M ( q ∷ T ) q' with (sid M q ) ≟ (sid M q') -... | yes _ = insert M T q' -... | no _ = q ∷ (insert M T q' ) - -merge : { Q : Set } { Σ : Set } → ( NAutomaton Q Σ ) → List Q → List Q → List Q -merge M L1 [] = L1 -merge M L1 ( H ∷ L ) = insert M (merge M L1 L ) H +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 ( λ () ) -Nmoves : { Q : Set } { Σ : Set } - → NAutomaton Q Σ - → List Q → List Σ → List Q -Nmoves {Q} { Σ} M q L = Nmoves1 q L [] - where - Nmoves1 : (q : List Q ) ( L : List Σ ) → List Q → List Q - Nmoves1 q [] _ = q - Nmoves1 [] (_ ∷ L) LQ = Nmoves1 LQ L [] - Nmoves1 (q ∷ T ) (H ∷ L) LQ = Nmoves1 T (H ∷ L) ( merge M ( nδ M q H ) LQ ) - - -Naccept : { Q : Set } { Σ : Set } - → NAutomaton Q Σ - → List Σ → Bool -Naccept {Q} { Σ} M L = - checkAccept ( Nmoves M ((nstart M) ∷ [] ) L ) - where - checkAccept : (q : List Q ) → Bool - checkAccept [] = false - checkAccept ( H ∷ L ) with (nend M) H - ... | true = true - ... | false = checkAccept L - - -transition2 : States1 → In2 → List States1 -transition2 sr i0 = (sr ∷ []) -transition2 sr i1 = (ss ∷ sr ∷ [] ) -transition2 ss i0 = (sr ∷ []) -transition2 ss i1 = (st ∷ []) -transition2 st i0 = (sr ∷ []) -transition2 st i1 = (st ∷ []) - -am2 : NAutomaton States1 In2 -am2 = record { nδ = transition2 ; sid = s1id ; nstart = sr ; nend = fin1} - - -example2-1 = Naccept am2 ( i0 ∷ i1 ∷ i0 ∷ [] ) -example2-2 = Naccept am2 ( i1 ∷ i1 ∷ i1 ∷ [] ) -
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agda/nfa-list.agda Mon Nov 05 07:53:48 2018 +0900 @@ -0,0 +1,96 @@ +module nfa-list where + +open import Level renaming ( suc to succ ; zero to Zero ) +open import Data.Nat +open import Data.List +open import Data.Maybe +open import Data.Bool using ( Bool ; true ; false ) +open import Relation.Binary.PropositionalEquality hiding ( [_] ) +open import Relation.Nullary using (¬_; Dec; yes; no) + + +data States1 : Set where + sr : States1 + ss : States1 + st : States1 + +data In2 : Set where + i0 : In2 + i1 : In2 + +transition1 : States1 → In2 → States1 +transition1 sr i0 = sr +transition1 sr i1 = ss +transition1 ss i0 = sr +transition1 ss i1 = st +transition1 st i0 = sr +transition1 st i1 = st + +fin1 : States1 → Bool +fin1 st = true +fin1 _ = false + +s1id : States1 → ℕ +s1id sr = 0 +s1id ss = 1 +s1id st = 2 + +record NAutomaton ( Q : Set ) ( Σ : Set ) + : Set where + field + nδ : Q → Σ → List Q + sid : Q → ℕ + nstart : Q + nend : Q → Bool + +open NAutomaton + +insert : { Q : Set } { Σ : Set } → ( NAutomaton Q Σ ) → List Q → Q → List Q +insert M [] q = q ∷ [] +insert M ( q ∷ T ) q' with (sid M q ) ≟ (sid M q') +... | yes _ = insert M T q' +... | no _ = q ∷ (insert M T q' ) + +merge : { Q : Set } { Σ : Set } → ( NAutomaton Q Σ ) → List Q → List Q → List Q +merge M L1 [] = L1 +merge M L1 ( H ∷ L ) = insert M (merge M L1 L ) H + +Nmoves : { Q : Set } { Σ : Set } + → NAutomaton Q Σ + → List Q → List Σ → List Q +Nmoves {Q} { Σ} M q L = Nmoves1 q L [] + where + Nmoves1 : (q : List Q ) ( L : List Σ ) → List Q → List Q + Nmoves1 q [] _ = q + Nmoves1 [] (_ ∷ L) LQ = Nmoves1 LQ L [] + Nmoves1 (q ∷ T ) (H ∷ L) LQ = Nmoves1 T (H ∷ L) ( merge M ( nδ M q H ) LQ ) + + +Naccept : { Q : Set } { Σ : Set } + → NAutomaton Q Σ + → List Σ → Bool +Naccept {Q} { Σ} M L = + checkAccept ( Nmoves M ((nstart M) ∷ [] ) L ) + where + checkAccept : (q : List Q ) → Bool + checkAccept [] = false + checkAccept ( H ∷ L ) with (nend M) H + ... | true = true + ... | false = checkAccept L + + +transition2 : States1 → In2 → List States1 +transition2 sr i0 = (sr ∷ []) +transition2 sr i1 = (ss ∷ sr ∷ [] ) +transition2 ss i0 = (sr ∷ []) +transition2 ss i1 = (st ∷ []) +transition2 st i0 = (sr ∷ []) +transition2 st i1 = (st ∷ []) + +am2 : NAutomaton States1 In2 +am2 = record { nδ = transition2 ; sid = s1id ; nstart = sr ; nend = fin1} + + +example2-1 = Naccept am2 ( i0 ∷ i1 ∷ i0 ∷ [] ) +example2-2 = Naccept am2 ( i1 ∷ i1 ∷ i1 ∷ [] ) +
--- a/agda/omega-automaton.agda Mon Sep 17 20:43:59 2018 +0900 +++ b/agda/omega-automaton.agda Mon Nov 05 07:53:48 2018 +0900 @@ -118,12 +118,10 @@ next n | ts | false = 1 next n | ts* | true = 2 next n | ts* | false = 1 + infinite' : (n m : ℕ) → n ≥″ m → aend ωa2 (ω-run ωa2 (m + (next m)) flip-seq) ≡ true → aend ωa2 (ω-run ωa2 (n + (next n)) flip-seq) ≡ true + infinite' = {!!} infinite : (n : ℕ) → aend ωa2 (ω-run ωa2 (n + (next n)) flip-seq) ≡ true - infinite n with ω-run ωa2 n flip-seq | flip-seq n | - infinite n | ts | true = {!!} - infinite n | ts | false = {!!} - infinite n | ts* | true = {!!} - infinite n | ts* | false = {!!} + infinite = {!!} lemma3 : Buchi ωa1 false-seq → ⊥ lemma3 = {!!}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agda/regop.agda Mon Nov 05 07:53:48 2018 +0900 @@ -0,0 +1,34 @@ +module regop where + +open import automaton + +-- open import Level renaming ( suc to succ ; zero to Zero ) +open import Data.Nat +open import Data.List +open import Data.Maybe +open import Data.Product +open import Data.Bool using ( Bool ; true ; false ; _∧_ ) +open import Relation.Binary.PropositionalEquality hiding ( [_] ) +open import Relation.Nullary using (¬_; Dec; yes; no) + + +union : {Q1 Q2 Σ : Set } → ( M1 : Automaton Q1 Σ) ( M2 : Automaton Q2 Σ) → Automaton (Q1 × Q2) Σ +union {Q1} {Q2} {Σ} M1 M2 = record { + δ = δ + ; astart = astart + ; aend = aend + } where + δ : (Q1 × Q2) → Σ → (Q1 × Q2) + δ = {!!} + astart : (Q1 × Q2) + astart = {!!} + aend : (Q1 × Q2) → Bool + aend = {!!} + +data _∨_ (A B : Set) : Set where + p1 : A → A ∨ B + p2 : B → A ∨ B + +union← : {Q1 Q2 Σ : Set } → ( M1 : Automaton Q1 Σ) ( M2 : Automaton Q2 Σ) → + ∀ ( s : List Σ ) → accept ( union M1 M2 ) s ≡ true → ( ( accept M1 s ≡ true ) ∨ ( accept M2 s ≡ true) ) +union← {Q1} {Q2} {Σ} M1 M2 s eq = {!!}
--- a/index.ind Mon Sep 17 20:43:59 2018 +0900 +++ b/index.ind Mon Nov 05 07:53:48 2018 +0900 @@ -1,7 +1,27 @@ -title: オートマトン -この授業では、Agda を使って、計算機科学の基礎であるオートマトンとチューリングマシンについえ学びます。 +この授業では、 +計算機科学の基礎であるオートマトンとチューリングマシンについて学ぶ。 +オートマトンはCPUなどの状態を持つハードウェアを数学的に定義したもの。 +正規表現を実際に使う場合の問題点に付いて調べる。 +可能な状態遷移を一度に調べる非決定性オートマトン、 非決定性Turing Machine、 +それらに基づく計算量のクラスであるNPを調べる。 +Turing Machineの停止性を判定できないことを証明する。 +無限の入力に対するオートマトンの性質の時相論理により記述する方法を学ぶ。 + +-- 達成目標 +証明支援系であるAgda を使って、automaton を形式的に定義し性質を証明できるようになる。 +オートマトンには +文字列の検索に使うキーワードの組合せや繰り返しを表す正規表現と同等の能力が +あることを理解する。 +インタラクティブシステムの検証方法に付いて理解し、検証ツールを使えるようになる。 + +-- 教科書 + +Introduction to the Theory of Computation +ISBN 0-534-95097-3 +https://en.wikipedia.org/wiki/Introduction_to_the_Theory_of_Computation -- 参考書 @@ -9,76 +29,28 @@ 「やさしい Haskell 入門 (バージョン98)」 </a> -<a href="http://www.amazon.co.jp/dp/4274068854"> -すごい Haskell Miran Lipova -</a> - - -<a href="http://www.amazon.co.jp/exec/obidos/redirect?link_code=ur2&tag=shinjkonoshom-22&camp=247&creative=1211&path=external-search%3Fsearch-type=ss%26index=books-jp%26keyword=%25E9%2581%2594%25E4%25BA%25BA%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B0%25E3%2583%25A9%25E3%2583%259E%25E3%2583%25BC">達人プログラマー</a> -アンドリュー ハント、デビッド トーマス (ピアソン・エデュケーション) - オブジェクト指向における再利用のためのデザインパターンエリッ - ク ガンマ (著), ラルフ ジョンソン (著), リチャード ヘルム ( - 著), ジョン ブリシディース (著), Erich Gamma (原著), Ralph Johnson - (原著), Richard Helm (原著), John Vlissides (原著), 本位田 - 真一 (翻訳), 吉田 和樹 (翻訳) - -<a href="http://www.amazon.co.jp/exec/obidos/redirect?link_code=ur2&tag=shinjkonoshom-22&camp=247&creative=1211&path=external-search%3Fsearch-type=ss%26index=books-jp%26keyword=%25E3%2583%2597%25E3%2583%25AD%25E3%2582%25B0%25E3%2583%25A9%25E3%2583%259F%25E3%2583%25B3%25E3%2582%25B0%25E4%25BD%259C%25E6%25B3%2595">プログラミング作法</a> - ブライアン カーニハン (著), ロブ パイク (著), Brian Kernighan (原著), Rob Pike (\ - 原著), 福崎 俊博 (翻訳) - -<a href="http://www.amazon.co.jp/exec/obidos/redirect?link_code=ur2&tag=shinjkonoshom-22&camp=247&creative=1211&path=external-search%3Fsearch-type=ss%26index=books-jp%26keyword=%25E3%2582%2584%25E3%2581%2595%25E3%2581%2597%25E3%2581%2584UML%25E5%2585%25A5%25E9%2596%2580">やさしいUML入門</a> Javaオブジェクト・モデリング - 浅海 智晴 (著) - -<a href="http://www.amazon.co.jp/exec/obidos/redirect?link_code=ur2&tag=shinjkonoshom-22&camp=247&creative=1211&path=external-search%3Fsearch-type=ss%26index=books-jp%26keyword=%25E3%2582%25B3%25E3%2583%25BC%25E3%2583%2589%25E3%2582%25B3%25E3%2583%25B3%25E3%2583%2597%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%2588">コードコンプリート</a> —完全なプログラミングを目指してMicrosoft PRESS - スティーブ マコネル (著), Steve McConnell (原著), 石川 勝 (翻訳) - -<a href="http://www.amazon.co.jp/exec/obidos/redirect?link_code=as2&path=ASIN/4894714515&tag=shinjkonoshom-22&camp=247&creative=1211">Effective C++ 原著第3版</a> -- 評価方法 - 演習の結果を総合して判定する。 - + +レポートにより判定する。 --授業計画 <ol> -<li> ソフトウェア工学 -<li><a href="s01/lecture.html"> 集合、論理、関数</a> -<li><a href="s02-logic/lecture.html"> 一階述語論理とシーケント代数</a> -<li><a href="s02/lecture.html"> Haskell 入門</a> -<li><a href="s02/lecture-functor.html"> Haskell のFunctor</a> -<li><a href="s03/lecture.html"> Curry Howard 対応 </a> -<li><a href="s04/lecture.html"> Agda </a> -<li><a href="s05/lecture.html"> Category と Natural Transformation </a> -<li><a href="s06/lecture.html"> Monad </a> -<li><a href="s07/lecture.html"> Monad の合成 </a> -<li><a href="s08/lecture.html"> Design Pattern と Refactoring </a> -<li><a href="s09/lecture.html"> Test と Debug </a> +<li><a href="a01/lecture.html"> オートマトンの概要</a> +<li><a href="a02/lecture.html"> Agdaによる数学的構造の定義と証明</a> +<li><a href="a03/lecture.html"> 決定性オートマトン</a> +<li><a href="a04/lecture.html"> 非決定性オートマトン </a> +<li><a href="a05/lecture.html"> 正規表現</a> +<li><a href="a06/lecture.html"> 正規表現とオートマトン </a> +<li><a href="a07/lecture.html"> 非決定性オートマトンから決定性オートマトンへの変換</a> +<li><a href="a08/lecture.html"> push donwオートマトンと文法クラス</a> +<li><a href="a09/lecture.html"> Turing Machine</a> +<li><a href="a10/lecture.html"> Turing Machine と計算量の理論</a> +<li><a href="a11/lecture.html"> ω オートマトン</a> +<li><a href="a12/lecture.html"> 時相論理とCTL</a> +<li><a href="a13/lecture.html"> モデル検査とSAT</a> </ol> -電子メールおよび ura.ie.classes.software のニュースグループを使用する。 - ---古い授業 +電子メールおよび ura.ie.classes.automaton のニュースグループを使用する。 -<ol> -<li><a href="old/s02-perlmod/epkg.html"> EasyPackage </a> -<li><a href="old/s02-perlmod/lecture.html"> Perl と Perl module </a> -<li><a href="old/s03python/lecture.html"> Python</a> -<li><a href="old/s03ruby/Rubyin5minutes.html"> 5分でわかる Ruby</a> -<li><a href="old/s04haskell2/lecture-ruby.html"> Ruby part 2</a> -<li><a href="old/s03ruby/lecture.html"> Ruby UML Web framework</a> -<li><a href="old/s04haskell2/haskell.html"> Haskell part 1</a> -<li><a href="old/s04haskell2/haskell2.html"> Haskell part 2</a> -<li><a href="old/s04haskell2/haskell3.html"> Haskell part 3</a> -<li><a href="old/s04haskell2/haskell4.html"> Haskell part 4</a> -<li><a href="old/s05-emacslisp/lecture-lisp.html"> Emacs Lisp</a> -<li><a href="old/s06-UML/lecture-lisp.html"> Lisp part 2</a> -<li><a href="old/s05-logic/coq.html"> Coq</a> -<li><a href="old/s11-prolog/lecture.html"> Prolog</a> -<li><a href="old/s05-logic/prolog.html"> Prolog part 2</a> -<li><a href="old/s06-UML/object.html"> Object 指向</a> -<li><a href="old/s07-applescript/lecture.html"> AppleScript</a> -<li><a href="old/s07-objective-C/lecture.html"> Objective C</a> -<li><a href="old/s10-server/lecture.html"> Server Programming</a> -<li><a href="old/s12-erlang/lecture-erlang.html"> Eralang</a> -</ol> -