回文とか"真ん中がc"とかだと、着目ポイントが絞れなくて何をやっていいのかわからなくなってしまった
CFG vs PEG Proofathon
October 17, 2009 ~ March 06, 2011
200 messages
Context Free Language の有限個の intersection では作れないけれど
<pre>Context Free Language の有限個の intersection では作れないけれど</pre>
Conjunctive Grammar http://users.utu.fi/aleokh/conjunctive/ という、
ルールの中でもintersectionを取れる文法なら書ける
<pre>Conjunctive Grammar http://users.utu.fi/aleokh/conjunctive/ という、 ルールの中でもintersectionを取れる文法なら書ける</pre>
正確には、{wcw | w∈{a,b}*} がConjunctive Grammarだと書けるそうな
<pre>正確には、{wcw | w∈{a,b}*} がConjunctive Grammarだと書けるそうな</pre>
PEGもルールの中で (&P) ってintersectionとれるので、一見出来そうだけど、
<pre>PEGもルールの中で (&P) ってintersectionとれるので、一見出来そうだけど、</pre>
intersectionに加えて (a|b)^n c (a|b)^* a (a|b)^n が書けないと書けなさそうなので
PEGだとこっちが難しい
<pre>intersectionに加えて (a|b)^n c (a|b)^* a (a|b)^n が書けないと書けなさそうなので PEGだとこっちが難しい</pre>
あと、deterministic context-free grammar で回文が書けない証明を読んでました。
結構しんどかった。
<pre>あと、deterministic context-free grammar で回文が書けない証明を読んでました。 結構しんどかった。</pre>
原論文っぽいのは、上の方で書いた「正規言語はpostfix indexが有限」の拡張みたいなことをやっていた
<pre>原論文っぽいのは、上の方で書いた「正規言語はpostfix indexが有限」の拡張みたいなことをやっていた</pre>
「DCFGで書けるならば、ある文字列to文字列の関数Eが存在して、index(w++E(w)) は有限通り」
<pre>「DCFGで書けるならば、ある文字列to文字列の関数Eが存在して、index(w++E(w)) は有限通り」</pre>
E(w)は、直感的には、deterministic pushdown automaton のwを読んだ後のスタックをできるだけ限界まで消費するような文字列を計算する関数で、そうやってスタックの底をつかせると状態パターン数がほとんどないはずなので有限に落ちるらしい。
<pre>E(w)は、直感的には、deterministic pushdown automaton のwを読んだ後のスタックをできるだけ限界まで消費するような文字列を計算する関数で、そうやってスタックの底をつかせると状態パターン数がほとんどないはずなので有限に落ちるらしい。</pre>
Stephen N. Cole "Deterministic Pushdown Store Machines and Real-Time Computation" Journal of the ACM, 1971.
<pre>Stephen N. Cole "Deterministic Pushdown Store Machines and Real-Time Computation" Journal of the ACM, 1971.</pre>
ところで、僕の言ってることが意味不明だったら容赦なく突っ込むといいと思います>ALL。さっきから専門用語を連発しすぎている気が自分ですごくしている
<pre>ところで、僕の言ってることが意味不明だったら容赦なく突っ込むといいと思います>ALL。さっきから専門用語を連発しすぎている気が自分ですごくしている</pre>
Fordのpoplのスライドで (a|b)^n a (a|b)^n が書くのが難しそうってのがありました.
<pre>Fordのpoplのスライドで (a|b)^n a (a|b)^n が書くのが難しそうってのがありました.</pre>
PEGどころかdeterministic PDAで書けないという証明もなかなかできないでいる
<pre>PEGどころかdeterministic PDAで書けないという証明もなかなかできないでいる</pre>
さっきの回文の時の方法を使おうとしても E(w)=a^(|w|+1) を取るとすぐに有限にできてしまう
<pre>さっきの回文の時の方法を使おうとしても E(w)=a^(|w|+1) を取るとすぐに有限にできてしまう</pre>
あれ、そうでもないかな>さっきの回文の時の方法を使おうとしても E(w)=a^(|w|+1) を取るとすぐに有限にできてしまう
<pre>あれ、そうでもないかな>さっきの回文の時の方法を使おうとしても E(w)=a^(|w|+1) を取るとすぐに有限にできてしまう</pre>
これだと後ろに a^2|w|+1 文字を足すまでは無条件acceptで、それ以降は1番目に足した文字、2番目に足した文字、…に依存、だから、|w|に応じて全部違うindexになる
<pre>これだと後ろに a^2|w|+1 文字を足すまでは無条件acceptで、それ以降は1番目に足した文字、2番目に足した文字、…に依存、だから、|w|に応じて全部違うindexになる</pre>
論文では、「DCFGなら有限になる、逆は、わからないけど、ならないんじゃないかな。Eが計算可能、くらいの制約つければなるかも」と書いてありました
<pre>論文では、「DCFGなら有限になる、逆は、わからないけど、ならないんじゃないかな。Eが計算可能、くらいの制約つければなるかも」と書いてありました</pre>
どんなEをとっても、任意のn∈Nに対して|w1++E(w1)|,...,|wn++E(wn)| が全て異なるような w1 から wn をとれる。そしてこいつらのindexは全部異なる。ので、常に無限。
<pre>どんなEをとっても、任意のn∈Nに対して|w1++E(w1)|,...,|wn++E(wn)| が全て異なるような w1 から wn をとれる。そしてこいつらのindexは全部異なる。ので、常に無限。</pre>
しかし (a|b)^n c (a|b)* a (a|b)^n はやっぱり難しいな。E(w)はw++E(w)がちょうどマッチするように伸ばす関数にしちゃえば有限だ。
<pre>しかし (a|b)^n c (a|b)* a (a|b)^n はやっぱり難しいな。E(w)はw++E(w)がちょうどマッチするように伸ばす関数にしちゃえば有限だ。</pre>
ここにきて素朴な質問をしますが、CFGで左再帰でかけるようなのって、PEGだとどうなるんでしょう?
<pre>ここにきて素朴な質問をしますが、CFGで左再帰でかけるようなのって、PEGだとどうなるんでしょう?</pre>
<pre>wikipedia http://ja.wikipedia.org/wiki/%E5%B7%A6%E5%86%8D%E5%B8%B0</pre>
PEGからCFGに変換した段階で大きくなるんならえらいこっちゃではなくなるんじゃないですか?
<pre>PEGからCFGに変換した段階で大きくなるんならえらいこっちゃではなくなるんじゃないですか?</pre>
文字列長の線形オーダでparseができるようになったら、それはやっぱりえらいことな気がする
<pre>文字列長の線形オーダでparseができるようになったら、それはやっぱりえらいことな気がする</pre>
あと、parseというかCFGに入るかの検査は線形オーダでも、構文木を復元するのはえらい計算量になるような変換しか見つからない可能性もある
<pre>あと、parseというかCFGに入るかの検査は線形オーダでも、構文木を復元するのはえらい計算量になるような変換しか見つからない可能性もある</pre>
CFGのparsingの計算量と言えば、暇があったら
<pre>CFGのparsingの計算量と言えば、暇があったら http://arxiv.org/abs/math.GR/0307321 と http://arxiv.org/abs/math.GR/0511460 読みたい。</pre>
多倍長整数の乗算をFFTで周波数の世界にもっておくと速くなるようなノリで、行列を怪しげな群にもっていくと行列乗算が速くなりそうらしいという話
<pre>多倍長整数の乗算をFFTで周波数の世界にもっておくと速くなるようなノリで、行列を怪しげな群にもっていくと行列乗算が速くなりそうらしいという話</pre>
オートマトンとか形式言語の方で
怪しげな群とかモノイドとかに持って行く話で面白そうな結果を最近よく見かけるので
なんかまとめて勉強したいなあ
<pre>オートマトンとか形式言語の方で 怪しげな群とかモノイドとかに持って行く話で面白そうな結果を最近よく見かけるので なんかまとめて勉強したいなあ</pre>
http://github.com/kik/cpppeg/blob/master/sample-6.cpp Wikipediaにのってた {a^nb^nc^n} はこんな感じに書ける
<pre>http://github.com/kik/cpppeg/blob/master/sample-6.cpp Wikipediaにのってた {a^nb^nc^n} はこんな感じに書ける</pre>
http://github.com/kik/cpppeg/blob/master/sample-5.cpp 2^n-1のアルファベットにマッチはこんな感じに頭おかしく書ける
<pre>http://github.com/kik/cpppeg/blob/master/sample-5.cpp 2^n-1のアルファベットにマッチはこんな感じに頭おかしく書ける</pre>
if_<f::vector<A, unless<b_t> > >, replus<a_t>, const B&, unless<c_t>, eoi
<pre>if_<f::vector<A, unless<b_t> > >, replus<a_t>, const B&, unless<c_t>, eoi</pre>
とりあえず、ここまでの成果…まったく他人が読むのを想定しない文章ですみません… → http://d.hatena.ne.jp/bonotake/20091017/1255778787
<pre>とりあえず、ここまでの成果…まったく他人が読むのを想定しない文章ですみません… → http://d.hatena.ne.jp/bonotake/20091017/1255778787</pre>
でも、せめて pushdown automata の代数公理化が、Kleene 代数や否や、は手を動かすだけの簡単なお仕事なので、やればよかった、けど寝てました、ぐうぐう
<pre>でも、せめて pushdown automata の代数公理化が、Kleene 代数や否や、は手を動かすだけの簡単なお仕事なので、やればよかった、けど寝てました、ぐうぐう</pre>
そういえば S <- &(A !b) a+ B !c $ は aabc とかマッチしちゃうんじゃなかったかな.
<pre>そういえば S <- &(A !b) a+ B !c $ は aabc とかマッチしちゃうんじゃなかったかな.</pre>
Lambekgrammars are context-free grammars(Pentus, 1993).
<pre>Lambekgrammars are context-free grammars(Pentus, 1993).</pre>
equivalenceの証明 再掲 → http://lpcs.math.msu.su/~pentus/ftp/papers/contfr1.pdf
<pre>equivalenceの証明 再掲 → http://lpcs.math.msu.su/~pentus/ftp/papers/contfr1.pdf </pre>
a^n b^n c^n にマッチできると言われても自分では書けないからマッチできないも同然
<pre>a^n b^n c^n にマッチできると言われても自分では書けないからマッチできないも同然</pre>
PEGインスタンスジェネレータ作ったときは、&とか!とか実装するのが面倒だったので全部 / で書いてすごい大変だった
<pre>PEGインスタンスジェネレータ作ったときは、&とか!とか実装するのが面倒だったので全部 / で書いてすごい大変だった</pre>
S <- I A Y
I <- JTZ /
J <- KTZ /
K <- XbZ / X
Z <- TZ /
T <- a/b/c
A <- aA / a # a+
X <- aXb / ab # a^n b^n
Y <- bYc / bc # b^n c^n
<pre> S <- I A Y I <- JTZ / J <- KTZ / K <- XbZ / X Z <- TZ / T <- a/b/c A <- aA / a # a+ X <- aXb / ab # a^n b^n Y <- bYc / bc # b^n c^n </pre>
gが空文字列にマッチしないという仮定の下で (!e)fg ==> (e _* / f)g
<pre>gが空文字列にマッチしないという仮定の下で (!e)fg ==> (e _* / f)g</pre>
なんか違う気がするけど、(!e) を、eにマッチしたら_*で全部食い尽くして強制failする表現に変換している
<pre>なんか違う気がするけど、(!e) を、eにマッチしたら_*で全部食い尽くして強制failする表現に変換している</pre>
======================================= 終 了 ===============================
<pre>======================================= 終 了 ===============================</pre>
いやーしかし全然ダメだった。僕の今日の成果はDPDAのfinite-indexの作り方を学んだというだけに終わってしまった。
<pre>いやーしかし全然ダメだった。僕の今日の成果はDPDAのfinite-indexの作り方を学んだというだけに終わってしまった。</pre>
<pre>http://en.wikipedia.org/w/index.php?title=Parsing_expression_grammar&diff=290940694&oldid=290563933</pre>
これは {a^n b^n c^n | n>=0} を作ろうとしているから (&A c) にはできないのか。どうすればよいか
<pre>これは {a^n b^n c^n | n>=0} を作ろうとしているから (&A c) にはできないのか。どうすればよいか</pre>
S <- !( !( !(Xb) X T) T) A Y から!をとると上のようになるのかな。たぶん
<pre>S <- !( !( !(Xb) X T) T) A Y から!をとると上のようになるのかな。たぶん</pre>
そんなバグが入るような文法をつかって、プログラミング言語作るのはキモイ、という結論もありかも
<pre>そんなバグが入るような文法をつかって、プログラミング言語作るのはキモイ、という結論もありかも</pre>
A <- a A? b と A <- a A b / ε って同値じゃないんだっけ
<pre>A <- a A? b と A <- a A b / ε って同値じゃないんだっけ</pre>
gem install treetop とかいうのを見つけたのが今日 1 時間くらいの成果
<pre>gem install treetop とかいうのを見つけたのが今日 1 時間くらいの成果</pre>
peg.hppはPEGにするのやめて、同じ記法でLL(1)かなんかのパーザを作成するようにするか
<pre>peg.hppはPEGにするのやめて、同じ記法でLL(1)かなんかのパーザを作成するようにするか</pre>
証明するときには context-free という性質はものすごい扱いやすいことを実感した。
<pre>証明するときには context-free という性質はものすごい扱いやすいことを実感した。</pre>
まあ、確かにそうですよね>a^n b^n c^n みたいな言語にマッチしたいことはほぼない
<pre>まあ、確かにそうですよね>a^n b^n c^n みたいな言語にマッチしたいことはほぼない</pre>
INTERCAL という、式の開き括弧も閉じ括弧も " か ' という素敵な言語がありましてね
<pre>INTERCAL という、式の開き括弧も閉じ括弧も " か ' という素敵な言語がありましてね</pre>
・チュートリアル的な云々はちゃんと資料準備した方がよかった。アドリブでなんとかなると思ってたのは甘かった
<pre>・チュートリアル的な云々はちゃんと資料準備した方がよかった。アドリブでなんとかなると思ってたのは甘かった</pre>
・やっぱチャットだとインタラクションは難しいな。といってオフで集まっても今以上にgdgdになりそうではある
<pre>・やっぱチャットだとインタラクションは難しいな。といってオフで集まっても今以上にgdgdになりそうではある</pre>
(※ lingr.com/user/signup?letmein=cpon でアカウントを作ってsign inしてご参加下さい)
じゃ足りなかったですか
<pre>http://atnd.org/events/1779 の (※ lingr.com/user/signup?letmein=cpon でアカウントを作ってsign inしてご参加下さい) じゃ足りなかったですか</pre>
一応招待制という扱いっぽいのであんまりデカデカリンク張ってはいけないような気がして控えめにしたんだけど
<pre>一応招待制という扱いっぽいのであんまりデカデカリンク張ってはいけないような気がして控えめにしたんだけど</pre>
僕はletmein=scalaから入ったのにscala部屋に行ったことが一度もないダメ人間
<pre>僕はletmein=scalaから入ったのにscala部屋に行ったことが一度もないダメ人間</pre>
「こんなもん誰も真剣に考えてないからOpenProblemにされているだけで、実は一日集中して考えたらどうにでもなるんじゃね?」と思ってしまう問題は結構あるので、また今度面白いのを見つけたら、もーちょいちゃんと計画して、またやってみようかなーと思います。
<pre>「こんなもん誰も真剣に考えてないからOpenProblemにされているだけで、実は一日集中して考えたらどうにでもなるんじゃね?」と思ってしまう問題は結構あるので、また今度面白いのを見つけたら、もーちょいちゃんと計画して、またやってみようかなーと思います。</pre>
わざわざイベントにしないと「一日集中して」なんて結局やらないで終わる傾向にあるので、無理矢理機会を作る作戦です。
<pre>わざわざイベントにしないと「一日集中して」なんて結局やらないで終わる傾向にあるので、無理矢理機会を作る作戦です。</pre>
自分も結構楽しかったです。普段あんまり証明しない人なんで、実はけっこうきつかったですけど。勉強してリベンジしたいなあ。
<pre>自分も結構楽しかったです。普段あんまり証明しない人なんで、実はけっこうきつかったですけど。勉強してリベンジしたいなあ。</pre>
Chunks最適化(メモ化用のテーブルをいくつかに分割することで、消費メモリを削減する最適化)が、消費メモリ削減にはかなり効きますね。自分が作ってるパーザジェネレータだと、パフォーマンス改善にもかなり効きました。
<pre>Chunks最適化(メモ化用のテーブルをいくつかに分割することで、消費メモリを削減する最適化)が、消費メモリ削減にはかなり効きますね。自分が作ってるパーザジェネレータだと、パフォーマンス改善にもかなり効きました。</pre>
Start Reading: Kotha+ 2010 (MICRO 43): "Automatic Parallelization in a Binary Rewriter" http://portal.acm.org/citation.cfm?id=1934997
<pre>Start Reading: Kotha+ 2010 (MICRO 43): "Automatic Parallelization in a Binary Rewriter" http://portal.acm.org/citation.cfm?id=1934997</pre>




