SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
オートマトン初歩の初歩
   2012.7.19 hiratara
オートマトンとは

普通は有限オートマトンのこと

 DFA(Deterministic Finite Automaton)

 NFA(Nondeterministic Finite Automaton)

プッシュダウン・オートマトン、生け垣オー
トマトンなど
DFA

文字の列を入力にとる

入力した列を受理するか否か判定する

有限個の状態を持ち、入力された文字に応じ
て順次遷移する
DFA
                               0
       0
                       1
A             B            C
       1

                           1
0

001, 101, 10110 → 受理
000, 010, 10000 → 受理しない
DFAの構成要素
状態 (A, B, C)

アルファベット (0, 1)

遷移関数 ( (A, 0) → A, (A, 1) → B, ...)

開始状態 (A)

受理状態 (B, C)
NFA


DFAの拡張

遷移先が1つではなく複数

空文字(ε)による遷移を許す
NFA
                        ε

                        0
A              B            C
        1

 1

10, 1010, 111010 → 受理
01, 1111, 10100 → 受理しない
NFAの構成要素

状態 (A, B, C)

アルファベット (0, 1)

遷移関数 ( (A, 0) → Φ, (A, 1) → (A, B), (A, ε)
→ Φ, ...)

開始状態 (A)
DFAとNFAの特徴


DFAは単純でシミュレーションしやすい

NFAは表現力が高く人間が作りやすい

DFAとNFAは等価である
DFAとNFAの特徴


DFAは単純でシミュレーションしやすい

NFAは表現力が高く人間が作りやすい

DFAとNFAは等価である
NFAをDFAに変換する
                1

          1            0
    A         A, B             A,C
                       1
          0
                           0

状態集合のベキ集合を
  とるとよい
                0, 1
正規表現

アルファベット (ε, 0, 1)

選択 ( 0|1 )

結合 ( 01 )

繰り返し (1*)
ふつうの正規表現

ほとんどは先ほどの演算で書ける

 [01] → 0|1

 0? → 0|

 1+ → 11*

 . → [01]

書けないもの → 後方参照 (.+)(1)
正規表現の特徴


人間にわかりやすい記述で言語を指定できる
(言語 = 文字列の集合)

NFA、DFAと等価
正規表現の特徴


人間にわかりやすい記述で言語を指定できる
(言語 = 文字列の集合)

NFA、DFAと等価
正規表現をNFAに
0
    0
             0|1
                       0
                   ε
                   ε
1                      1
    1
正規表現をNFAに
01
      0   ε   1


          ε
0*
      ε   0
正規表現をNFAに
                       ε
(01|0)*
                   0       ε   1

          ε    ε
               ε
                   0
          ε
DFAを正規表現に


GNFA(Generalized Nondeterministic Finite
Automaton) を経由する

  遷移を正規表現で書いたもの
DFAを正規表現へ

            0
    0
        1
    1

            1
0
DFAを正規表現へ

    開始状態と受理状態を加える
                        0
        0
ε               1
        1
            ε       ε
                        1
    0
DFAを正規表現へ

    同じ状態間の遷移をまとめる
                        0|1
        0
ε               1
        1
            ε       ε
    0
DFAを正規表現へ

         00*1           0|1

   0*1          1


            ε       ε


状態を減らしていく
DFAを正規表現へ

                         0|1

      0*1(00*1)* 1


                     ε
0*1(00*1)*
DFAを正規表現へ



0*1(00*1)*| 0*1(00*1)* 1(0|1)*
ここまでのまとめ


DFAとNFAと正規表現は等価

DFAは実装が容易でパフォーマンスも良い

NFAや正規表現は表現力があり人間に優しい
DFAの限界

正規 (DFA)

文脈自由 (バッカス・ナウア記法)

判定可能 (チューリングマシンが停止する)

認識可能 (ループしてもよい)
応用1: 逆FizzBuzz


問題: FizzBuzz の逆写像を作りなさい


例えば、{‘fizz’, ‘buzz’, ‘fizz’} が入力された
ら、 {3, 4, 5, 6} を返す
NFAで表現できる
           buzz               fizz
      3              5                    6

           fizz    buzz              fizz            fizz
fizz                              fizz
                               buzz
           fizzbuzz       fizz                             9
           fizzbuzz              fizz                 buzz
      15                 12                   10
応用1: 逆FizzBuzz


受理される経路で、もっとも距離が小さい物
を求めれば良い

ただし、DFAに変換すると距離情報が捨てら
れるのでNG
応用2: 曖昧検索の高速化


 問: 単語辞書の中から、ユーザが入力した文字
 列に近い文字列を選び出す

 力づくで計算する場合は、全単語について編
 集距離を求めて最小値をとる
応用2: 曖昧検索の高速化

 例: 辞書が「Python、Perl、PHP」で入力が
 Phone だった場合
 Phone → Pyhone → Pythone → Python
 Phone → Peone → Perne → Perle → Perl
 Phone → Phpne → Phpn → Php

 Perlだけ編集距離が4、後は3
応用2: 曖昧検索の高速化
【辞書】      ユーザの入力 “photo”
basic
c
c++
java
haskell
perl
php
python
ruby
応用2: 曖昧検索の高速化
【辞書】       ユーザの入力 “photo”
basic
c
c++
java
haskell
          photoと編集距離がn以下の単語
perl
php       を受理するオートマトンを作る
python
ruby
応用2: 曖昧検索の高速化
【辞書】        ユーザの入力 “photo”


c
c++       basic
java
haskell
perl
php               辞書の最初の単語を
python       オートマトンに入力する
ruby
応用2: 曖昧検索の高速化
【辞書】        ユーザの入力 “photo”


c
c++       basic              bhoto
java
haskell
perl
php       バックトラックにより次に受理
python      されるはずの単語を求める
ruby
応用2: 曖昧検索の高速化
【辞書】      ユーザの入力 “photo”
basic

c++       c
java
haskell
perl
php       “bhoto”より大きい次の候補を
python    辞書から取り出し、続ける
ruby
Levenshtein Automata
      c       m         s


  . ε, .   . ε, .   . ε, .
      c       m         s


  . ε, .   . ε, .   .   ε, .
       c      m         s
NFAをDFAにする

                        s
            m
                    m


[^c]            c


       c
           複雑なので略
受理される単語を探す
例: “ocn”の次に受理される単語
                s
             m
                     m


 [^c]            c


        c
            複雑なので略
受理される単語を探す
    “oc”の後、nは駄目。
    o,p,q,r,...も駄目       s
             m
                     m


 [^c]            c


        c
            複雑なので略
受理される単語を探す
        バックトラックする
                         s
             m
                     m


 [^c]            c


        c
            複雑なので略
受理される単語を探す
    “oc”が駄目だったので、
        “od”, “oe”, “of” ... s
             m
                       m


 [^c]            c


        c
            複雑なので略
受理される単語を探す
            “om” であればOK
                           s
               m
                       m


 [^c]              c


        c
             複雑なので略
受理される単語を探す
        “oms” は受理される
                         s
             m
                     m


 [^c]            c


        c
            複雑なので略
受理される単語を探す


“ocn”から”oms”までの単語は受理されない
→つまり編集距離が遠い
→編集距離を求めず、飛ばしてよい
まとめ


オートマトンは様々な理論の基礎
知っておけば読める情報が増える

DFAへ変換することで、ロジックの見直しや
パフォーマンスの改善に繋がる

Mais conteúdo relacionado

Mais procurados

言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3Kenta Hattori
 
言語処理系入門1
言語処理系入門1言語処理系入門1
言語処理系入門1Kenta Hattori
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0sunaemon
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング道化師 堂華
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指してbleis tift
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2sunaemon
 
Php 12時間目(for文(ループ処理)応用)
Php 12時間目(for文(ループ処理)応用)Php 12時間目(for文(ループ処理)応用)
Php 12時間目(for文(ループ処理)応用)internous,inc.
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたKazuyuki TAKASE
 
Palin
PalinPalin
Palinoupc
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話bleis tift
 
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftTomohiro Kumagai
 
スクリプトで文字コード変換
スクリプトで文字コード変換スクリプトで文字コード変換
スクリプトで文字コード変換1000 VICKY
 
TCAMのしくみ
TCAMのしくみTCAMのしくみ
TCAMのしくみogatay
 

Mais procurados (20)

言語処理系入門3
言語処理系入門3言語処理系入門3
言語処理系入門3
 
言語処理系入門1
言語処理系入門1言語処理系入門1
言語処理系入門1
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
C++ lecture-0
C++ lecture-0C++ lecture-0
C++ lecture-0
 
Ilerpg Study 002
Ilerpg Study 002Ilerpg Study 002
Ilerpg Study 002
 
エラーハンドリング
エラーハンドリングエラーハンドリング
エラーハンドリング
 
C++11
C++11C++11
C++11
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 
Ilerpg Study 003
Ilerpg Study 003Ilerpg Study 003
Ilerpg Study 003
 
C++ lecture-2
C++ lecture-2C++ lecture-2
C++ lecture-2
 
Php 12時間目(for文(ループ処理)応用)
Php 12時間目(for文(ループ処理)応用)Php 12時間目(for文(ループ処理)応用)
Php 12時間目(for文(ループ処理)応用)
 
Ilerpg Study 004
Ilerpg Study 004Ilerpg Study 004
Ilerpg Study 004
 
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみたScala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
 
Palin
PalinPalin
Palin
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
Ilerpg Study 006
Ilerpg Study 006Ilerpg Study 006
Ilerpg Study 006
 
現実(えくせる)と戦う話
現実(えくせる)と戦う話現実(えくせる)と戦う話
現実(えくせる)と戦う話
 
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swiftみんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
みんなで Swift 復習会での談笑用スライド – 4th #minna_de_swift
 
スクリプトで文字コード変換
スクリプトで文字コード変換スクリプトで文字コード変換
スクリプトで文字コード変換
 
TCAMのしくみ
TCAMのしくみTCAMのしくみ
TCAMのしくみ
 

Mais de Masahiro Honma

レンズ (ぶつかり稽古の没プレゼン)
レンズ (ぶつかり稽古の没プレゼン)レンズ (ぶつかり稽古の没プレゼン)
レンズ (ぶつかり稽古の没プレゼン)Masahiro Honma
 
すべてが@__kanになる
すべてが@__kanになるすべてが@__kanになる
すべてが@__kanになるMasahiro Honma
 
Types and perl language
Types and perl languageTypes and perl language
Types and perl languageMasahiro Honma
 
カレーとHokkaidopm
カレーとHokkaidopmカレーとHokkaidopm
カレーとHokkaidopmMasahiro Honma
 
モナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gzモナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gzMasahiro Honma
 
モナモナ言うモナド入門
モナモナ言うモナド入門モナモナ言うモナド入門
モナモナ言うモナド入門Masahiro Honma
 
循環参照のはなし
循環参照のはなし循環参照のはなし
循環参照のはなしMasahiro Honma
 
Hachioji.pm in Machida の LT
Hachioji.pm in Machida の LTHachioji.pm in Machida の LT
Hachioji.pm in Machida の LTMasahiro Honma
 
ウヰスキーとPSGI
ウヰスキーとPSGIウヰスキーとPSGI
ウヰスキーとPSGIMasahiro Honma
 
モデルから知るGit
モデルから知るGitモデルから知るGit
モデルから知るGitMasahiro Honma
 
YAPCレポートの舞台裏
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏Masahiro Honma
 
Stateモナドの解説 後編
Stateモナドの解説 後編Stateモナドの解説 後編
Stateモナドの解説 後編Masahiro Honma
 

Mais de Masahiro Honma (20)

レンズ (ぶつかり稽古の没プレゼン)
レンズ (ぶつかり稽古の没プレゼン)レンズ (ぶつかり稽古の没プレゼン)
レンズ (ぶつかり稽古の没プレゼン)
 
すべてが@__kanになる
すべてが@__kanになるすべてが@__kanになる
すべてが@__kanになる
 
Types and perl language
Types and perl languageTypes and perl language
Types and perl language
 
Currying in perl
Currying in perlCurrying in perl
Currying in perl
 
カレーとHokkaidopm
カレーとHokkaidopmカレーとHokkaidopm
カレーとHokkaidopm
 
モナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gzモナモナ言うモナド入門.tar.gz
モナモナ言うモナド入門.tar.gz
 
モナモナ言うモナド入門
モナモナ言うモナド入門モナモナ言うモナド入門
モナモナ言うモナド入門
 
Perl saved a lady.
Perl saved a lady.Perl saved a lady.
Perl saved a lady.
 
20120526 hachioji.pm
20120526 hachioji.pm20120526 hachioji.pm
20120526 hachioji.pm
 
循環参照のはなし
循環参照のはなし循環参照のはなし
循環参照のはなし
 
Arrows in perl
Arrows in perlArrows in perl
Arrows in perl
 
Hachioji.pm in Machida の LT
Hachioji.pm in Machida の LTHachioji.pm in Machida の LT
Hachioji.pm in Machida の LT
 
Monads in perl
Monads in perlMonads in perl
Monads in perl
 
ウヰスキーとPSGI
ウヰスキーとPSGIウヰスキーとPSGI
ウヰスキーとPSGI
 
モデルから知るGit
モデルから知るGitモデルから知るGit
モデルから知るGit
 
YAPCレポートの舞台裏
YAPCレポートの舞台裏YAPCレポートの舞台裏
YAPCレポートの舞台裏
 
Git入門
Git入門Git入門
Git入門
 
AnyEvent and Plack
AnyEvent and PlackAnyEvent and Plack
AnyEvent and Plack
 
Math::Category
Math::CategoryMath::Category
Math::Category
 
Stateモナドの解説 後編
Stateモナドの解説 後編Stateモナドの解説 後編
Stateモナドの解説 後編
 

Último

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Último (9)

論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

Levenshtein Automata