アルファベット 上の正規表現
を考える。次の文字列のうち、 が表す言語 に属するものをすべて選べ。
ア:
イ:
ウ:
エ:
オ:
和 ・連接・クリーネ閉包 からなる正規表現 の言語 を読み取り、与えられた文字列が に属するかを判定でき、2 つの正規表現が同じ言語を表すかを判断できる
中学までに習ったことだけで始められます。
正規表現は、文字列の集まり(言語)を ・連接・ の 3 つの操作だけで短く書き表す方法です。この技能を身につけると、正規表現 を見てそれが表す言語 を言葉で説明できます。また、与えられた文字列が に入るかを判定でき、2 つの正規表現が同じ言語を表すかどうかも判断できます。テキスト検索のパターン、字句解析、オートマトンの設計などで使います。
文字の有限集合 (アルファベット)を決めます。 の文字を有限個(0 個でもよい)並べたものを文字列といい、長さ 0 の文字列を と書きます。文字列の集合を言語といいます。正規表現と、それが表す言語 は、小さい部品から順に次のように定めます。各文字 について 、、 です。正規表現 に対しては次のように定めます。
・和:(どちらかに合う)
・連接:(前半が 、後半が に合うように切れる)
・閉包:( に合う断片を 0 個以上つなげたもの)
演算の強さは > 連接 > の順です。たとえば は と読みます。
このように は部品の言語から組み立てられています。そのため「文字列 が に入るか」という問いは、部品についての小さな問いに分解できます。たとえば を調べるには、 を前後 2 つに切る方法(有限通り)を試し、前が 、後ろが に入る切り方があるかを見ればよいです。 なら、 を の要素の断片に区切れるかを見ます。 ならいつでも入ります。
2 つの正規表現 が同じ言語を表す()とは、集合として等しいこと、つまり と の両方が成り立つことです。等しくないことを示すには、一方にだけ入る文字列を 1 つ挙げれば十分です。等しいことを示すには、それぞれの言語を言葉で特徴づけ(例:「 からなる任意の文字列」)、両方の包含を確かめます。
正規表現に括弧を補い、構造をはっきりさせる(優先順位は > 連接 > )。例:
内側の部品から順に言語を読み取り、 を言葉で特徴づける(例: は からなるすべての文字列で、 も含む)
判定する文字列 について、外側の演算に合わせて調べる。 ならどちらかに入るか、連接なら前後に切れるか、 なら の断片に区切れるかを見る
区切り方が 1 通りも見つからないときは、その理由を示す(例:「どの断片も で終わるのに、 は で終わる」)。その上で と結論する
2 つの正規表現の比較では、まず短い文字列を順に試して、一方にだけ入る反例を探す。反例があれば等しくない。見つからなければ両方の言語を言葉で特徴づけ、 と を確かめる
アルファベット 上の正規表現 について、次の文字列のうち に属するものをすべて選べ。
ア: イ: ウ: エ:
手順 1: は 全体に がかかった形です。中の は「 または 」と読みます。
手順 2: です。したがって は、断片 と を好きな順に 0 個以上つなげた文字列全体になります( も含む)。どちらの断片も で終わり、 の直後には必ず が来ます。
手順 3(判定):
ア と区切れるので、属します。
イ :先頭の で始まる断片は しかありません。ところが 2 文字目は です。 の直後が でないので区切れず、属しません。
ウ と区切れるので、属します。
エ :どの断片も で終わるので、空でない の要素は必ず で終わります。 は で終わるので、属しません(手順 4)。
よって、属するのはアとウです。
答え: ア, ウ
を と読んでしまう誤り。正しくは は直前の 1 文字(または括弧のまとまり)だけにかかり、 である。 だが、。
と を同じ言語だと思ってしまう誤り。正しくは だが、 である。逆に だが、。
としてしまう誤り。正しくは では断片ごとに か を選び直せるので、 である。一方 は「 だけ」か「 だけ」の列なので、。
に空文字列が入ることを忘れる誤り。正しくは繰り返し 0 回を含むので、どんな でも である( でもある)。
この説明は AI が書き、別の AI が例題を独立に解いて答えを確かめ、説明を一歩ずつ査読しました。