Backus–Naur記法

同義語:BNFBN記法BNF記法Backus-Naur記法バッカス・ナウア記法Backus normal form

概要

Backus–Naur記法(Backus–Naur form)とは、文字列の集合(形式言語)を生成規則の一覧として書き表す記法であり、BNF と略される。非終端記号ごとに「::=」の右側へ許される形を「|」で並べて書き、規則を繰り返し当てはめて非終端記号が残らなくなるまで置き換えて得られる終端記号列の全体を、その非終端記号が生成する言語とする。数学的には文脈自由文法を書くための記法であり、生成される言語は各行を集合の方程式と読んだときの最小解、すなわち規則で閉じた最小の集合に一致するので、各生成規則が構造的帰納法の一つの段階に対応する。プログラミング言語 ALGOL 58/60 の構文記述のために導入され、数理論理学では命題論理の論理式などの構文を一行で宣言する標準的な語法となった。

$$$$

前提知識: 形式言語, 文脈自由文法, 文字列, 帰納的定義

定義

記号の有限集合(アルファベット)$\Sigma$ に対し、$\Sigma$ の元を有限個並べた文字列の全体を $\Sigma^{*}$ と書き、長さ $0$ の文字列(空語)を $\varepsilon$ で表す。$\Sigma^{*}$ の部分集合を $\Sigma$ 上の形式言語という。Backus–Naur記法は、形式言語を「規則の一覧」で指定するための書き方である。

Backus–Naur記法

$\Sigma$ を終端記号(terminal symbol)の有限集合、$N$ を $\Sigma$ と交わらない非終端記号(nonterminal symbol。変数記号、構文範疇ともいう)の有限集合とし、$(N\cup\Sigma)^{*}$ で $N\cup\Sigma$ 上の文字列全体を表す。
Backus–Naur記法(Backus–Naur form; BNF)とは、各非終端記号 $A\in N$ について

      <A> ::= α1 | α2 | … | αk
    

の形の行($k\ge 1$、各 $\alpha_i\in(N\cup\Sigma)^{*}$)を並べて文法を書き表す記法である。ここで <A> は非終端記号 $A$ を、::= は「左辺の記号は右辺のいずれかの形の文字列に置き換えてよい」ことを、| は選択肢の区切りを表す。各選択肢 $\alpha_i$ は非終端記号と終端記号を並べた文字列であり、空語 $\varepsilon$ でもよい。
この一行は $k$ 本の生成規則(production rule)$A\to\alpha_1,\ \dots,\ A\to\alpha_k$ をまとめて書いたものであり、BNF で書かれた規則の一覧全体は生成規則の有限集合 $P\subset N\times(N\cup\Sigma)^{*}$ を定める。逆に、有限集合 $P$ が与えられれば、左辺 $A$ ごとに右辺を | で並べることで BNF の一覧が得られる。規則を一つも持たない非終端記号を許す流儀もあり、その場合その記号の生成する言語は空集合 $\emptyset$ になるだけで、以下の議論は変わらない。

導出と生成される言語

文字列 $\gamma A\delta$($\gamma,\delta\in(N\cup\Sigma)^{*}$、$A\in N$)の中の非終端記号 $A$ の一つの出現を、生成規則 $A\to\alpha\in P$ により $\alpha$ で置き換える操作を導出の一歩といい、$\gamma A\delta\Rightarrow\gamma\alpha\delta$ と書く。$\Rightarrow$ を $n$ 回続けて行うことを $\Rightarrow^{n}$、有限回($0$回を含む)続けて行うことを $\Rightarrow^{*}$ と書き、$\beta\Rightarrow^{*}\gamma$ となる列を $\beta$ から $\gamma$ への導出(derivation)という。
非終端記号 $A$ が生成する言語を
$$L(A):=\{\,w\in\Sigma^{*}\mid A\Rightarrow^{*}w\,\}$$
と定める。すなわち $L(A)$ は、$A$ から出発して規則を繰り返し当てはめ、非終端記号が残らなくなるまで置き換えて得られる終端記号列の全体である。非終端記号の一つ $S\in N$ を開始記号として指定した組 $G=(N,\Sigma,P,S)$ は文脈自由文法(context-free grammar)であり、$L(G):=L(S)$ を $G$ の生成する言語という。$L(G)$ の形で得られる言語が文脈自由言語である。

BNF は文脈自由文法の「書き方」であって、文脈自由文法と別の数学的対象ではない。文脈自由文法・文脈自由言語の一般論(Chomsky階層における位置、プッシュダウンオートマトンとの対応、反復補題など)は 文脈自由文法・文脈自由言語 の担当とし、本記事は記法としての BNF、すなわち規則の書き方、BNF で言語を定義するとはどういうことか、そして書いた BNF がどの言語を定めるかを確かめる方法を扱う。

書き方の約束

BNF の細部には文献ごとの流儀差があるが、次の約束が広く共有されている。

  • 非終端記号は <expr>、<digit> のように山括弧で囲んだ名前で書く。文脈から区別できるときは山括弧を省き、$E$、$\varphi$ のような裸の文字で書くことも多い。
  • 終端記号はそのまま(または引用符で囲んで)書く。右辺に並べた記号の間の空白は区切りのためのものであり、記号列の一部ではない。
  • 空語 $\varepsilon$ を選択肢にするときは、空の選択肢(<A> ::= | a <A>)や <empty>、ε などで表す。
  • 数学の文献では ::= の代わりに $\to$ や $=$ を書くこともある。論理学では結合子(論理結合子) $\to$ と衝突するため ::= が好まれる。
  • 一つの非終端記号に対する規則を複数行に分けて書いてもよい。行の順序は言語に影響しない。
    以下、本記事では BNF の規則は等幅のコードとして書き、その規則から定まる集合や導出を述べるときは数式で $A\Rightarrow\alpha$ のように書く。

直感

BNF は「作ってよい形のカタログ」を書き並べる記法である。各行は「この種類のものは、次のいずれかの形をしている」と宣言し、右辺に同じ種類(あるいは別の種類)の名前が現れることで、有限個の行が無限個の文字列を記述する。カタログの形を有限回当てはめて組み立てられる文字列だけが合法であり、それ以外は非合法である。したがって BNF で言語を定めることは、その言語の上の帰納的定義を与えることと同じであり、生成規則の一本一本が構造的帰納法の一つの段階に対応する(cor-bnf-structural-induction)。

例と反例

二進表現された自然数

終端記号を $\Sigma=\{0,1\}$、非終端記号を $N=\{B,B',b\}$ とし、次の BNF を考える。

      <B>  ::= <b> | 1 <B'>
<B'> ::= <b> | <b> <B'>
<b>  ::= 0 | 1
    

$B$ は先頭に不要な $0$ を持たない二進表現、$B'$ は $0$ または $1$ からなる空でない文字列、$b$ は一桁の二進数字を表す。たとえば
$$B\Rightarrow 1B'\Rightarrow 1bB'\Rightarrow 10B'\Rightarrow 10b\Rightarrow 101$$
は $5$ 歩の導出であり、$101\in L(B)$ を示す。$L(B)$ が
$$0,\ 1,\ 10,\ 11,\ 100,\ 101,\ 110,\ 111,\ 1000,\ \ldots$$
という文字列全体、すなわち $\{0\}\cup 1\{0,1\}^{*}$ に一致することは prop-bnf-binary-numeral で証明する。右辺に非終端記号自身が現れる(再帰する)ことにより、$3$ 行の規則で無限集合が指定されている。

算術式

終端記号を $\Sigma=\{0,1,+,-,\times,\div,(,)\}$ とし、ex-bnf-binary-numeral の <B> をそのまま使って

      <expr>   ::= <term> | <expr> + <term> | <expr> - <term>
<term>   ::= <factor> | <term> × <factor> | <term> ÷ <factor>
<factor> ::= <B> | ( <expr> )
    

とすると、$L(\mathtt{expr})$ は二進表現された自然数の四則演算と括弧からなる式の全体である。たとえば (0+10-1)×101÷1 は
$$\mathtt{expr}\Rightarrow\mathtt{term}\Rightarrow\mathtt{term}\div\mathtt{factor}\Rightarrow\mathtt{term}\times\mathtt{factor}\div\mathtt{factor}\Rightarrow\mathtt{factor}\times\mathtt{factor}\div\mathtt{factor}\Rightarrow(\mathtt{expr})\times\mathtt{factor}\div\mathtt{factor}\Rightarrow^{*}(0+10-1)\times101\div1$$
と導出される。非終端記号を <expr>・<term>・<factor> の三段に分けることで、乗除が加減より先に結び付き、同じ優先順位の演算は左から結び付くという構造(構文木の形)が文法自体に組み込まれている。この文法は式の構文だけを定めるものであり、1÷0 のように値が定義されない式も文字列としては $L(\mathtt{expr})$ に属する。

命題論理の論理式

$\mathrm{PropVar}=\{p_0,p_1,p_2,\ldots\}$ を命題変数の集合とし、終端記号を $\Sigma=\mathrm{PropVar}\cup\{\top,\bot,\lnot,\land,\lor,\to,(,)\}$、非終端記号を $N=\{\varphi\}$ とする。命題論理の論理式の定義は、次の一行で宣言できる。

      <φ> ::= p | ⊤ | ⊥ | (¬<φ>) | (<φ>∧<φ>) | (<φ>∨<φ>) | (<φ>→<φ>)
    

ここで p は $\mathrm{PropVar}$ の元すべてを走る。すなわち第1の選択肢は、各 $p\in\mathrm{PropVar}$ ごとの生成規則 $\varphi\to p$ をまとめた略記である。$L(\varphi)$ が命題論理の論理式の集合である。たとえば
$$\varphi\Rightarrow(\varphi\to\varphi)\Rightarrow((\lnot\varphi)\to\varphi)\Rightarrow((\lnot p_0)\to\varphi)\Rightarrow((\lnot p_0)\to p_1)$$
は $4$ 歩の導出であり、$((\lnot p_0)\to p_1)\in L(\varphi)$ を示す。
$\mathrm{PropVar}$ が可算無限のとき、$\Sigma$ と規則の一覧も無限になり、def-bnf-notation の有限性の仮定から外れる。本記事の導出に関する議論(lem-bnf-derivation-splitting、prop-bnf-least-solution)は $N$、$\Sigma$、$P$ の有限性をどこにも使わないので、この例のように無限個の記号・規則を許して読み替えても成り立つ。有限性を保ちたければ、命題変数を有限個に制限するか、命題変数 $p_i$ を p と添字の二進表現の列として有限個の記号で符号化すればよい。

等式論理の項と論理式

言語 $\mathscr{L}$ の関数記号の集合を固定し、各関数記号 $f$ に項数 $n_f\in\mathbb{N}$ が定まっているとする。変数記号 $v$、関数記号 $f$、および括弧・コンマ・等号を終端記号とし、$\mathscr{L}$-項 $t$ と等式論理の $\mathscr{L}$-論理式 $\varphi$ を

      <t> ::= v | f(<t>, …, <t>)
<φ> ::= <t> = <t>
    

で定義する。ここで v は変数記号すべてを走り、f(<t>, …, <t>) は各関数記号 $f$ に対し <t> を $n_f$ 個並べた選択肢を表す($n_f=0$ のときは定数記号 f() または単に f)。右辺の = は終端記号としての等号であり、メタ記号 ::= とは別のものである。項数の異なる関数記号ごとに選択肢を書き分けるため、これも有限個または可算個の規則の略記である。

対応の取れた文字列

終端記号を $\Sigma=\{a,b\}$、非終端記号を $N=\{S\}$ とし

      <S> ::= | a <S> b
    

とする(第1の選択肢は空語)。$S\Rightarrow aSb\Rightarrow aaSbb\Rightarrow aabb$ により $aabb\in L(S)$ である。$L(S)=\{a^{n}b^{n}\mid n\in\mathbb{N}\}$ となることは prop-bnf-anbn-language で証明する。この言語は正規言語でないことが知られており(Sip12 Example 1.73)、BNF(文脈自由文法)が正規表現より広い範囲の言語を書けることの標準的な例である。

反例:導出できない文字列

ex-bnf-propositional-formula の文法で、文字列 $p_0\land$ や $)p_0($ は $L(\varphi)$ に属さない。実際、prop-bnf-paren-balance と同様の構造的帰納法により、「$L(\varphi)$ の元の末尾の記号は命題変数・$\top$・$\bot$・$)$ のいずれかである」「$L(\varphi)$ の元の先頭の記号が $)$ になることはない」という不変量が示され、$p_0\land$ は第一の不変量を、$)p_0($ は第一・第二の不変量を破る。すなわちこれらの文字列は「$\Sigma$ 上の文字列である」という性質は満たすが、「$\varphi$ から導出される」という性質を満たさない。BNF で文法を与えることは、同時に「何が論理式でないか」の判定基準を与えることでもある。

反例:曖昧な文法

BNF で書けることは、各文字列の組み立て方が一通りであることを保証しない。ex-bnf-arithmetic-expression の三段構成をやめて

      <E> ::= <B> | <E> - <E> | <E> × <E>
    

とすると(簡単のため減法と乗法だけを残した)、文字列 1-1-1 は「1-1 と 1 の差」としても「1 と 1-1 の差」としても、また 1-1×1 は「1-1 と 1 の積」としても「1 と 1×1 の差」としても組み立てられ、構文木(導出を、どの規則をどこに当てはめたかを表す木として描いたもの)が一通りに定まらない。ある文字列に対して構文木が二通り以上ある文法を曖昧な文法(ambiguous grammar)という。同様に、ex-bnf-propositional-formula から括弧を落とした

      <ψ> ::= p | ¬<ψ> | <ψ>∧<ψ> | <ψ>∨<ψ>
    

も曖昧であり、$p_0\land p_1\lor p_2$ は「$p_0\land p_1$ と $p_2$ の $\lor$」とも「$p_0$ と $p_1\lor p_2$ の $\land$」とも読める。
この反例が満たす性質は「文法が BNF で書けている(文脈自由文法である)」こと、満たさない性質は「各文字列の構文木が一意である」ことであり、破る含意は「BNF で書ける $\Rightarrow$ 構文木が一意」である。曖昧な文法の上では、真理値の割当て(真理値割り当て)や式の値のような「構文に沿った再帰による定義」が well-defined にならない。そのため論理式の文法には括弧(または結合の優先順位、ポーランド記法など)を組み込んで一意可読性を確保する。曖昧でない文法に書き直す方法や、曖昧さの判定が一般には不可能であることは HMU06 §9.5.2(Theorem 9.20)を参照。

性質

BNF で書いた文法が「本当に意図した言語を定めているか」を確かめる標準的な方法は、生成される言語を帰納的に定義された集合として捉え直すことである。まず、導出を各記号ごとに分ける補題を準備する。

導出の分解補題

$\alpha_1,\dots,\alpha_m\in(N\cup\Sigma)^{*}$($m\ge1$)とする。$\alpha_1\alpha_2\cdots\alpha_m\Rightarrow^{n}\gamma$ ならば、$\gamma=\gamma_1\gamma_2\cdots\gamma_m$、$n_1+n_2+\cdots+n_m=n$ かつ各 $j$ について
$$\alpha_j\Rightarrow^{n_j}\gamma_j$$
となる分解が存在する。特に、$\alpha_j$ が終端記号 $1$ 文字 $x\in\Sigma$ のときは $\gamma_j=x$、$n_j=0$ である。

導出の分解補題の証明

まず $m=2$ の場合を $n$ に関する帰納法で示す。$\alpha\beta\Rightarrow^{n}\gamma$ とする。$n=0$ なら $\gamma=\alpha\beta$ であり、$\gamma_1=\alpha$、$\gamma_2=\beta$、$n_1=n_2=0$ とすればよい。$n\ge1$ とする。最初の一歩は、文字列 $\alpha\beta$ の中のある非終端記号 $A$ の一つの出現を規則 $A\to\rho$ で置き換える。$\alpha\beta$ の各記号は $\alpha$ 由来か $\beta$ 由来かのいずれか一方であるから、この出現は $\alpha$ の内部にあるか $\beta$ の内部にあるかのどちらかである。$\alpha$ の内部にある場合、$\alpha=\alpha'A\alpha''$ と書け、一歩の後の文字列は $(\alpha'\rho\alpha'')\beta$ で、$(\alpha'\rho\alpha'')\beta\Rightarrow^{n-1}\gamma$ である。帰納法の仮定により $\gamma=\gamma_1\gamma_2$、$\alpha'\rho\alpha''\Rightarrow^{m_1}\gamma_1$、$\beta\Rightarrow^{m_2}\gamma_2$、$m_1+m_2=n-1$ となる分解がある。このとき $\alpha\Rightarrow\alpha'\rho\alpha''\Rightarrow^{m_1}\gamma_1$ だから $n_1=m_1+1$、$n_2=m_2$ とすればよい。出現が $\beta$ の内部にある場合も対称に同じ議論が通る。
一般の $m$ は $m$ に関する帰納法による。$m=1$ は自明である。$m\ge2$ のとき、$\alpha_1\cdots\alpha_m=(\alpha_1\cdots\alpha_{m-1})\alpha_m$ に $m=2$ の場合を適用して $\gamma=\gamma'\gamma_m$、$\alpha_1\cdots\alpha_{m-1}\Rightarrow^{n'}\gamma'$、$\alpha_m\Rightarrow^{n_m}\gamma_m$、$n'+n_m=n$ を得、$\gamma'$ に帰納法の仮定を適用すればよい。
最後に $\alpha_j=x\in\Sigma$ のとき、生成規則の左辺は非終端記号であるから、終端記号だけからなる文字列 $x$ には導出の一歩を適用できない。よって $x\Rightarrow^{n_j}\gamma_j$ は $n_j=0$、$\gamma_j=x$ のときに限る。

BNF の各行 <A> ::= α1 | … | αk は、「$A$ の集合は、$\alpha_1$ の形の文字列と……と $\alpha_k$ の形の文字列の合併である」という集合の方程式として読める。この読み方を正確にするために次の記号を用意する。

生成規則が定める集合の方程式

$X=(X_B)_{B\in N}$ を、非終端記号で添字づけられた $\Sigma^{*}$ の部分集合の族とする。文字列 $\alpha=x_1x_2\cdots x_m\in(N\cup\Sigma)^{*}$ に対し
$$\alpha[X]:=\{\,w_1w_2\cdots w_m\mid x_j\in\Sigma \text{ なら } w_j=x_j,\ x_j\in N \text{ なら } w_j\in X_{x_j}\,\}$$
と定める($m=0$ のとき $\alpha[X]=\{\varepsilon\}$)。すなわち $\alpha[X]$ は、$\alpha$ に現れる各非終端記号 $B$ を(出現ごとに独立に)$X_B$ の元で置き換えて得られる終端記号列の全体である。生成規則の集合 $P$ に対し、族 $X$ から族 $F_P(X)$ を
$$F_P(X)_A:=\bigcup_{A\to\alpha\in P}\alpha[X]\qquad(A\in N)$$
で定める。族の包含 $X\subset Y$ は、すべての $B\in N$ について $X_B\subset Y_B$ であることを意味するものとする。$F_P(X)\subset X$ を満たす族 $X$ を、$P$ について閉じているという。また $F_P(X)=X$ を満たす族を方程式系 $X=F_P(X)$ の解という。

$X\subset Y$ ならば $\alpha[X]\subset\alpha[Y]$ であり、したがって $F_P(X)\subset F_P(Y)$ である(単調性)。次の命題が、BNF で書いた文法の意味を確定する基本定理である。

生成言語と規則の方程式の最小解

$L:=(L(A))_{A\in N}$ とおく。

  1. $F_P(L)=L$。すなわち各 $A\in N$ について $L(A)=\bigcup_{A\to\alpha\in P}\alpha[L]$ が成り立ち、BNF の各行 <A> ::= α1 | … | αk は集合の等式 $L(A)=\alpha_1[L]\cup\cdots\cup\alpha_k[L]$ として読める。
  2. $P$ について閉じている任意の族 $X$ に対し $L\subset X$。
    したがって $L$ は方程式系 $X=F_P(X)$ の最小解であり、$L$ は「$P$ について閉じている族のうち最小のもの」として帰納的定義で定めた族と一致する。
生成言語と規則の方程式の最小解の証明

はじめに、導出は前後に文脈を付けても実行できることに注意する。すなわち $\beta\Rightarrow^{*}\beta'$ ならば任意の $\gamma,\delta$ について $\gamma\beta\delta\Rightarrow^{*}\gamma\beta'\delta$ である。実際、$\beta$ から $\beta'$ への導出の各一歩は $\beta$ の中の非終端記号の一つの出現の置き換えであり、同じ出現を $\gamma\beta\delta$ の中で置き換えれば同じ歩数の導出が得られる。
(1) $F_P(L)\subset L$ を示す。$A\to\alpha\in P$、$\alpha=x_1\cdots x_m$、$w=w_1\cdots w_m\in\alpha[L]$ とする。$x_j\in N$ なら $w_j\in L(x_j)$ だから $x_j\Rightarrow^{*}w_j$ であり、$x_j\in\Sigma$ なら $w_j=x_j$ だから $x_j\Rightarrow^{0}w_j$ である。上の注意により
$$A\Rightarrow x_1x_2\cdots x_m\Rightarrow^{*}w_1x_2\cdots x_m\Rightarrow^{*}w_1w_2x_3\cdots x_m\Rightarrow^{*}\cdots\Rightarrow^{*}w_1w_2\cdots w_m=w$$
となり、$w\in L(A)$ である。
次に $L\subset F_P(L)$ を示す。$w\in L(A)$ とし、$A\Rightarrow^{n}w$ とする。$w\in\Sigma^{*}$ かつ $A\notin\Sigma$ だから $n\ge1$ であり、最初の一歩はある規則 $A\to\alpha\in P$ による $A\Rightarrow\alpha$ で、$\alpha\Rightarrow^{n-1}w$ である。$\alpha=\varepsilon$ のときは、$\varepsilon$ は非終端記号を含まないので書き換えられず、$w=\varepsilon\in\alpha[L]$ である。$\alpha=x_1\cdots x_m$($m\ge1$)のときは、lem-bnf-derivation-splitting により $w=w_1\cdots w_m$、$x_j\Rightarrow^{n_j}w_j$ と分解でき、$x_j\in\Sigma$ なら $w_j=x_j$、$x_j\in N$ なら $w_j$ は $w$ の部分文字列ゆえ終端記号列なので $w_j\in L(x_j)$ である。よって $w\in\alpha[L]\subset F_P(L)_A$。
(2) $X$ を $P$ について閉じている族とする。「$A\in N$、$A\Rightarrow^{n}w$、$w\in\Sigma^{*}$ ならば $w\in X_A$」を $n$ に関する強帰納法(数学的帰納法)で示す。(1) の後半と同様に $n\ge1$ で、最初の一歩は $A\Rightarrow\alpha$($A\to\alpha\in P$)、$\alpha\Rightarrow^{n-1}w$ である。$\alpha=\varepsilon$ なら $w=\varepsilon\in\alpha[X]\subset F_P(X)_A\subset X_A$。$\alpha=x_1\cdots x_m$($m\ge1$)なら lem-bnf-derivation-splitting により $w=w_1\cdots w_m$、$x_j\Rightarrow^{n_j}w_j$、$n_1+\cdots+n_m=n-1$ と分解でき、$x_j\in\Sigma$ なら $w_j=x_j$、$x_j\in N$ なら $n_j\le n-1< n$ だから帰納法の仮定により $w_j\in X_{x_j}$ である。よって $w\in\alpha[X]\subset F_P(X)_A\subset X_A$。
最後の主張を確かめる。方程式系の任意の解 $X$ は $F_P(X)=X\subset X$ ゆえ閉じているので、(2) により $L\subset X$ であり、(1) により $L$ 自身が解だから、$L$ は最小解である。また、すべての成分を $\Sigma^{*}$ とした族は閉じているので閉じている族は存在し、閉じている族全体の共通部分を $I$(成分ごとに $I_B:=\bigcap_X X_B$)とおくと、単調性により各閉じた $X$ について $F_P(I)\subset F_P(X)\subset X$ だから $F_P(I)\subset I$、すなわち $I$ も閉じている。(2) により $L\subset I$、(1) により $L$ は閉じているので $I\subset L$。よって $L=I$ である。

この最小解は写像 $F_P$ の最小不動点であり、Knaster–Tarski の定理の枠組みでも理解できる(Knaster–Tarskiの定理)。

生成規則に沿った帰納法

各非終端記号 $A\in N$ について、$\Sigma^{*}$ の文字列に関する性質 $\mathcal{P}_A$ が与えられているとする。すべての生成規則 $A\to x_1\cdots x_m\in P$ と、$x_j\in\Sigma$ なら $w_j=x_j$、$x_j\in N$ なら $\mathcal{P}_{x_j}(w_j)$ を満たすすべての文字列 $w_1,\dots,w_m$ について $\mathcal{P}_A(w_1\cdots w_m)$ が成り立つならば、各 $A\in N$ について $L(A)$ のすべての元が $\mathcal{P}_A$ を満たす。

生成規則に沿った帰納法の証明

$X_A:=\{w\in\Sigma^{*}\mid\mathcal{P}_A(w)\}$ とおく。仮定はちょうど、各 $A\to\alpha\in P$ について $\alpha[X]\subset X_A$、すなわち $F_P(X)\subset X$ を意味する。よって prop-bnf-least-solution (2) により $L(A)\subset X_A$ である。

この系は、BNF の各生成規則が構造的帰納法の一つの帰納段階に対応することを述べている。BNF で文法を書くことは、その言語の上の帰納法と再帰の枠組みを同時に宣言することである。以下、この系を使って、例に挙げた BNF が意図した言語を定めることを確かめる。

二進表現の文法が生成する言語

ex-bnf-binary-numeral の文法について
$$L(b)=\{0,1\},\qquad L(B')=\{0,1\}^{+},\qquad L(B)=\{0\}\cup1\{0,1\}^{*}$$
が成り立つ。ここで $\{0,1\}^{+}$ は $\{0,1\}$ 上の空でない文字列全体、$1\{0,1\}^{*}$ は $1$ で始まる文字列全体である。

二進表現の文法が生成する言語の証明

$X_b:=\{0,1\}$、$X_{B'}:=\{0,1\}^{+}$、$X_B:=\{0\}\cup1\{0,1\}^{*}$ とおく。
($L\subset X$)族 $X$ が閉じていることを規則ごとに確かめる。$b\to0$、$b\to1$:$0,1\in X_b$。$B'\to b$:$X_b\subset X_{B'}$。$B'\to bB'$:$X_bX_{B'}\subset\{0,1\}^{+}$。$B\to b$:$0\in X_B$、$1=1\varepsilon\in1\{0,1\}^{*}\subset X_B$。$B\to1B'$:$1X_{B'}=1\{0,1\}^{+}\subset1\{0,1\}^{*}$。よって cor-bnf-structural-induction により $L(b)\subset X_b$、$L(B')\subset X_{B'}$、$L(B)\subset X_B$。
($X\subset L$)$b\Rightarrow0$、$b\Rightarrow1$ より $X_b\subset L(b)$。$u\in\{0,1\}^{+}$ について $u\in L(B')$ を $|u|$ に関する帰納法で示す。$|u|=1$ なら $B'\Rightarrow b\Rightarrow u$。$|u|\ge2$ なら $u=cu'$($c\in\{0,1\}$、$u'\in\{0,1\}^{+}$)と書け、帰納法の仮定 $B'\Rightarrow^{*}u'$ と文脈を付けた導出により $B'\Rightarrow bB'\Rightarrow cB'\Rightarrow^{*}cu'=u$。最後に $B\Rightarrow b\Rightarrow0$、$B\Rightarrow b\Rightarrow1$、および $u\in\{0,1\}^{+}$ について $B\Rightarrow1B'\Rightarrow^{*}1u$ により $X_B\subset L(B)$。

対応の取れた文字列の文法が生成する言語

ex-bnf-anbn の文法について $L(S)=\{a^{n}b^{n}\mid n\in\mathbb{N}\}$ が成り立つ。

対応の取れた文字列の文法が生成する言語の証明

$X_S:=\{a^{n}b^{n}\mid n\in\mathbb{N}\}$ とおく。
($L(S)\subset X_S$)規則 $S\to\varepsilon$ について $\varepsilon=a^{0}b^{0}\in X_S$。規則 $S\to aSb$ について、$w=a^{n}b^{n}\in X_S$ なら $awb=a^{n+1}b^{n+1}\in X_S$。よって $X_S$ は閉じており、cor-bnf-structural-induction により $L(S)\subset X_S$。
($X_S\subset L(S)$)$n$ に関する帰納法で $a^{n}b^{n}\in L(S)$ を示す。$n=0$ なら $S\Rightarrow\varepsilon$。$n\ge1$ なら帰納法の仮定 $S\Rightarrow^{*}a^{n-1}b^{n-1}$ と文脈を付けた導出により $S\Rightarrow aSb\Rightarrow^{*}a\,a^{n-1}b^{n-1}\,b=a^{n}b^{n}$。

括弧の釣り合い

ex-bnf-propositional-formula の文法について、$w\in L(\varphi)$ の中に現れる $($ の個数と $)$ の個数は等しい。

括弧の釣り合いの証明

文字列 $w$ に現れる $($ の個数を $\ell(w)$、$)$ の個数を $r(w)$ とし、性質 $\mathcal{P}_\varphi(w)$ を $\ell(w)=r(w)$ とする。規則ごとに確かめる。$\varphi\to p$、$\varphi\to\top$、$\varphi\to\bot$:右辺は括弧を含まない $1$ 記号なので $\ell=r=0$。$\varphi\to(\lnot\varphi)$:$\ell(u)=r(u)$ なら $\ell((\lnot u))=1+\ell(u)=1+r(u)=r((\lnot u))$。$\varphi\to(\varphi\land\varphi)$:$\ell(u)=r(u)$、$\ell(v)=r(v)$ なら
$$\ell((u\land v))=1+\ell(u)+\ell(v)=1+r(u)+r(v)=r((u\land v))$$
であり、$\lor$、$\to$ も同様。よって cor-bnf-structural-induction により $L(\varphi)$ のすべての元が $\mathcal{P}_\varphi$ を満たす(この文法は規則が無限個だが、ex-bnf-propositional-formula で述べたとおり系はそのまま適用できる)。

一意可読性との関係

prop-bnf-paren-balance を括弧の数え上げとして精密化すると、「論理式の空でない真の接頭辞は論理式でない」という接頭辞性質が得られ、そこからex-bnf-propositional-formulaの各論理式 $w$ が $p$、$\top$、$\bot$、$(\lnot u)$、$(u\land v)$、$(u\lor v)$、$(u\to v)$ のいずれかちょうど一つの形を持ち、しかも $u$、$v$ が一意に定まること(一意可読性)が従う。証明は End01 Chapter 1 §1.3–1.4 にあり、Mathpedia では 一意可読性 の担当とする。一意可読性が成り立つおかげで論理式の構文木は一通りに定まり、真理値の割当てや部分論理式の概念が構文に沿った再帰で well-defined に定義できる。rem-bnf-ambiguous-grammar の文法ではこれが破綻する。

補足

歴史と名称

BNF の原型は、J. W. Backus が 1959 年にプログラミング言語 ALGOL 58(国際代数言語 IAL)の構文を記述するために提案した記法である(Bac59)。Backus の原記法は、非終端記号を <digit> のように山括弧で囲む点は現在と同じだが、定義の記号に :≡ を、選択肢の区切りに or を用いていた。P. Naur は ALGOL 60 報告書(Nau60、改訂版 Nau63)の編集にあたりこの記法を採用し、記号を ::= と | に改めたうえで、ALGOL 60 の構文全体をこの記法で記述した。BNF はこの報告書を通じて広まった。
当初この記法は「Backus normal form(Backus 正規形)」と呼ばれたが、D. E. Knuth は 1964 年の Communications of the ACM への書簡(Knu64)で、これは他の対象を標準形へ直す意味での「正規形」ではないこと、および Naur の貢献を明示すべきことを理由に、「Backus–Naur form」と呼ぶことを提案した。以後この呼称が標準となった。「Backus normal form」は現在も同義語として通用する。

拡張された記法との違い

BNF に略記を追加した方言を総称して拡張BNF(extended BNF; EBNF)という。典型的な追加は、$0$ 回以上の繰り返し { α }、省略可能 [ α ]、選択肢のまとまりを括る ( α | β )、終端記号を引用符で囲む書き方などであり、ISO/IEC 14977 として標準化された版もある(ISO14977)。たとえば ex-bnf-binary-numeral の文法は EBNF では

      B = "0" | "1", { "0" | "1" } ;
    

の一行で書ける。これらの略記は言語のクラスを広げない。実際、繰り返し <A> ::= β { γ } は新しい非終端記号 <R> を導入して

      <A> ::= β <R>
<R> ::= | γ <R>
    

と書き直せ、省略可能 [ γ ] は γ と空語の二つの選択肢に、括弧でまとめた選択肢は新しい非終端記号に展開できる。したがって EBNF で書ける言語は BNF で書ける言語、すなわち文脈自由言語のままである。

抽象構文の流儀

数理論理学や型理論の教科書では、ex-bnf-propositional-formula のように非終端記号とメタ変数($\varphi,\psi$ など)を同じ文字で兼用し、「$p$ は命題変数を走る」のような無限個の規則の略記を許す書き方が普通である。これを抽象構文(abstract syntax)の流儀という。この流儀では、文字列としての論理式よりも、それが表す構文木の形(どの結合子がどの部分論理式に施されているか)を宣言することに関心があり、括弧や結合の優先順位は「読み方の約束」として文法の外に置かれることも多い。厳密には、これは文脈自由文法そのものではなくその読みやすい略記であり、ex-bnf-propositional-formula のように具体的な記号列の文法へ翻訳することで正当化される。翻訳した文法が曖昧でないこと(rem-bnf-unique-readability)を確かめてはじめて、構文木の形について語ることが意味を持つ。

構文解析との関係

BNF で書かれた文法は、与えられた文字列がその言語に属するかを判定し、属するならその構文木を復元する構文解析(parsing)の出発点になる。非終端記号ごとに一つの手続きを用意し、右辺の選択肢に沿って再帰的に呼び出す再帰下降構文解析は、BNF の各行をほぼそのまま手続きへ写したものである。一般の文脈自由文法に対する構文解析アルゴリズムと、そのために文法を変形する方法は HMU06 第5章・第7章を参照。

関連項目

参考文献

[1]
John E. Hopcroft, Rajeev Motwani, Jeffrey D. Ullman, Introduction to Automata Theory, Languages, and Computation, Pearson / Addison-Wesley, 2006, Chapter 5 Context-Free Grammars and Languages(§5.1 導出と生成言語、§5.4 曖昧性)、Chapter 7 Properties of Context-Free Languages(正規形と構文解析)、§9.5.2(曖昧性の決定不能性)
[2]
Michael Sipser, Introduction to the Theory of Computation, Cengage Learning, 2012, §1.4 Example 1.73($\{0^n1^n\}$ が正規言語でないこと)、§2.1 Context-Free Grammars(文脈自由文法と曖昧性)
[3]
Herbert B. Enderton, A Mathematical Introduction to Logic, Academic Press, 2001, Chapter 1 §1.1–1.4(論理式の帰納的定義、一意可読性、帰納と再帰)
[4]
John W. Backus, The syntax and semantics of the proposed international algebraic language of the Zürich ACM-GAMM Conference, Proceedings of the International Conference on Information Processing, UNESCO, Paris, 1959, 125–131

Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する