Нормальная форма Куроды — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 1: Строка 1:
 
{{Определение
 
{{Определение
 
|definition=Грамматика представлена в '''нормальной форме Куроды''' (англ.  ''Kuroda normal form''), если каждое правило имеет одну из четырех форм:
 
|definition=Грамматика представлена в '''нормальной форме Куроды''' (англ.  ''Kuroda normal form''), если каждое правило имеет одну из четырех форм:
# AB->CD
+
# <tex>AB \rightarrow CD</tex>
# A->BC
+
# <tex>A \rightarrow BC</tex>
# A->B
+
# <tex>A \rightarrow B</tex>
# A->a или A->\varepsilon
+
# <tex>A \rightarrow a</tex> или <tex>A \rightarrow \varepsilon</tex>
Где A, B, C, D {{---}} нетерминалы, a {{---}} терминал.
+
Где <tex>A, B, C, D</tex> {{---}} нетерминалы, <tex>a</tex> {{---}} терминал.
 
}}
 
}}
  
Строка 12: Строка 12:
 
{{Определение
 
{{Определение
 
|definition=Грамматика представлена в '''нормальной форме Пенттонена''' (англ. ''Penttonen normal form''), если каждое правило имеет одну из трех форм:
 
|definition=Грамматика представлена в '''нормальной форме Пенттонена''' (англ. ''Penttonen normal form''), если каждое правило имеет одну из трех форм:
# AB->CD
+
# <tex>AB \rightarrow CD</tex>
# A->BC
+
# <tex>A \rightarrow BC</tex>
# A->a или A->\varepsilon
+
# <tex>A \rightarrow a</tex> или <tex>A \rightarrow \varepsilon</tex>
Где A, B, C, D {{---}} нетерминалы, a {{---}} терминал.
+
Где <tex>A, B, C, D </tex> {{---}} нетерминалы, <tex>a</tex> {{---}} терминал.
 
}}
 
}}
  
Также грамматику Пенттонена называют односторонней нормальной формой (англ. one-sided normal form). Как можно заметить, она является частным случаем нормальной формы Куроды: когда A = C в первом правиле определения.
+
Также грамматику Пенттонена называют односторонней нормальной формой (англ. ''one-sided normal form''). Как можно заметить, она является частным случаем нормальной формы Куроды: когда <tex>A = C</tex> в первом правиле определения.
 
Для каждой контестно-зависимой грамматики существует слабо эквивалентная ей грамматика в форме Пенттонена.  
 
Для каждой контестно-зависимой грамматики существует слабо эквивалентная ей грамматика в форме Пенттонена.  
  
 
{{Лемма
 
{{Лемма
 
|about=об удалении терминалов
 
|about=об удалении терминалов
|statement = Для любой грамматики G = (N, T, P, S) может быть построена грамматика G' = (N', T, P', S) такая, что:
+
|statement = Для любой грамматики <tex>G = (N, T, P, S)</tex> может быть построена грамматика <tex>G' = (N', T, P', S)</tex> такая, что:
* все правила в P' имеет вид \alpha \rightarrow \beta где \alpha \in (N')^+ и \beta \in (N')^* или A \rightarrow a, где A \in N', a \in T,
+
* все правила в <tex>P'</tex> имеет вид <tex>\alpha \rightarrow \beta</tex> где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^*</tex> или <tex>A \rightarrow a</tex>, где <tex>A \in N', a \in T</tex>,
* L(G') = L(G)
+
* <tex>L(G') = L(G)</tex>
Кроме того, если G контекстно-свободна или контекстно-зависима, то и G' будет соответственно контекстно-свободной или контекстно-зависимой.
+
Кроме того, если G контекстно-свободна или контекстно-зависима, то и <tex>G'</tex> будет соответственно контекстно-свободной или контекстно-зависимой.
  
|proof = Каждому терминалу a поставим в соотвествие новый символ a', которого нет в N U T, такой что a' != b' для разных терминалов a и b.
+
|proof = Каждому терминалу <tex>a</tex> поставим в соотвествие новый символ <tex>a'</tex>, которого нет в <tex>N \cup T</tex>, такой что <tex>a' \neq b'</tex> для разных терминалов <tex>a</tex> и <tex>b</tex>.
Пусть N' = N U \{a' | a \in T\}
 
Пусть \alpha = x_1x_2...x_n {{---}} часть правила, тогда \alpha' = y_1y_2...y_n, где y_i = {x_i, если x_i \in N; x_i', если x_i \in T} для 1 <= i <= n.
 
Построим грамматику G' = (N', T, P', S), где P' = {\alpha' \rightarrow \beta' : \alpha \rightarrow \beta \in P} U {a' \rightarrow a: a \in T}.
 
  
Покажем, что L(G') = L(G).
+
Пусть <tex>N' = N \cup \{a' | a \in T\}</tex>.
  
Пусть w \in L(G). Тогда в G существует вывод S = w_0 => w_1 => ... => w_n => w.
+
Пусть <tex>\alpha = x_1x_2...x_n</tex> {{---}} часть правила, тогда <tex>\alpha' = y_1y_2...y_n</tex>, где <tex>y_i = \{x_i</tex>, если <tex>x_i \in N</tex>; <tex>x_i'</tex>, если <tex>x_i \in T\}</tex> для <tex>1 <= i <= n</tex>.
Согласно конструкции P', в G' существует вывод S = w_0' => w_1' => w_2' => ... => w_n' = v_0 => v_1 => v_2 => ... => v_m = w.
 
Для 0 <= i <= n - 1 в переходах w_i' => w_{i + 1}' используем правило \alpha' \rightarrow \beta', так как правило \alpha \rightarrow \beta было использовано при выводе w_i => w_{i + 1}.
 
Для 0 <= j <= m - 1 в переходах v_j => v_{j + 1} используем правила вида a' \rightarrow a.
 
Заменяем разрешенные в w' символы на новые и получаем, что w \in L(G').
 
Тогда L(G) <= L(G').
 
  
Пусть x \in L(G'). Тогда в G' существует вывод S =>* x. Мы можем поменять порядок применения правил в этом выводе:
+
Построим грамматику <tex>G' = (N', T, P', S)</tex>, где <tex>P' = \{\alpha' \rightarrow \beta' : \alpha \rightarrow \beta \in P\} \cup \{a' \rightarrow a: a \in T\}</tex>.
сначала только правила вида \alpha' \rightarrow \beta', а потом только правила вида a' \rightarrow a. Из построения: после применения правила вида a' \rightarrow a полученное a не может быть использовано при применении правил из P'.  
+
 
Изменение порядка вывода не меняет язык, то есть в G' существует вывод: S = x_0' => x_1' => ... => x_r' => x' => y_1 => y_2 => ... => y_s = x,
+
Покажем, что <tex>L(G') = L(G)</tex>.
где для 0 <= i <= r - 1 x_{i + 1}' \in (N')^* и в переходе x_i' \rightarrow x_{i + 1}' было использовано правило вывода \alpha' \rightarrow \beta'
+
 
и для 1 <= j <= s было использовано правило a' \rightarrow a, чтобы получить y_j \rightarrow y_{j + 1}.
+
Пусть <tex>w \in L(G)</tex>. Тогда в G существует вывод <tex>S = w_0 => w_1 => ... => w_n => w</tex>.
Получаем вывод в G: S = x_0 => x_1 => ... => x_n = x.
+
 
Тогда L(G') <= L(G).
+
Согласно конструкции <tex>P'</tex>, в <tex>G'</tex> существует вывод <tex>S = w_0' => w_1' => w_2' => ... => w_n' = v_0 => v_1 => v_2 => ... => v_m = w</tex>.
Таким образом, L(G') = L(G).
+
 
 +
Для <tex>0 <= i <= n - 1</tex> в переходах <tex>w_i' => w_{i + 1}'</tex> используем правило <tex>\alpha' \rightarrow \beta'</tex>, так как правило <tex>\alpha \rightarrow \beta</tex> было использовано при выводе <tex>w_i => w_{i + 1}</tex>.
 +
 
 +
Для <tex>0 <= j <= m - 1</tex> в переходах <tex>v_j => v_{j + 1}</tex> используем правила вида <tex>a' \rightarrow a</tex>.
 +
 
 +
Заменяем разрешенные в <tex>w'</tex> символы на новые и получаем, что <tex>w \in L(G')</tex>.
 +
Тогда <tex>L(G) <= L(G')</tex>.
 +
 
 +
Пусть <tex>x \in L(G')</tex>. Тогда в <tex>G'</tex> существует вывод <tex>S =>* x</tex>. Мы можем поменять порядок применения правил в этом выводе: сначала применяем только правила вида <tex>\alpha' \rightarrow \beta'</tex>, а потом только правила вида <tex>a' \rightarrow a</tex>.  
 +
 
 +
Из построения: после применения правила вида <tex>a' \rightarrow a</tex> полученное <tex>a</tex> не может быть использовано при применении правил из <tex>P'</tex>.  
 +
 
 +
Изменение порядка вывода не меняет язык, то есть в <tex>G'</tex> существует вывод: <tex>S = x_0' => x_1' => ... => x_r' => x' => y_1 => y_2 => ... => y_s = x</tex>, где для <tex>0 <= i <= r - 1 x_{i + 1}' \in (N')^*</tex> и в переходе <tex>x_i' \rightarrow x_{i + 1}'</tex> было использовано правило вывода <tex>\alpha' \rightarrow \beta'</tex> и для <tex>1 <= j <= s</tex> было использовано правило <tex>a' \rightarrow a</tex>, чтобы получить <tex>y_j \rightarrow y_{j + 1}</tex>.
 +
 
 +
Получаем вывод в <tex>G</tex>: <tex>S = x_0 => x_1 => ... => x_n = x</tex>.
 +
Тогда <tex>L(G') <= L(G)</tex>.
 +
Таким образом, <tex>L(G') = L(G)</tex>.
 
Очевидно, что если грамматика была неукорочивающейся, то она такой и останется.
 
Очевидно, что если грамматика была неукорочивающейся, то она такой и останется.
 
}}
 
}}
Строка 55: Строка 63:
 
{{Лемма
 
{{Лемма
 
|about=об удалении длинных правил
 
|about=об удалении длинных правил
|statement= Для любой грамматики G = (N, T, P, S) может быть построена грамматика  G' = (N', T, P', S) такая, что:
+
|statement= Для любой грамматики <tex>G = (N, T, P, S)</tex> может быть построена грамматика  <tex>G' = (N', T, P', S)</tex> такая, что:
* любое правило из P' имеет вид:  
+
* любое правило из <tex>P'</tex> имеет вид: <tex>\alpha \rightarrow \beta</tex>, где <tex>\alpha \in (N')^+</tex> и <tex>\beta \in (N')^+</tex> и <tex>|\alpha| <= |\beta|</tex>, или <tex>A \rightarrow a</tex>, или <tex>A \rightarrow \varepsilon</tex>, где <tex>A \in N'</tex> и <tex>a \in T</tex>
  \alpha \rightarrow \beta, где \alpha \in (N')^+ и \beta \in (N')^+ и |\alpha| <= |\beta|
+
* <tex>L(G') = L(G)</tex>
  или A \rightarrow a  
 
  или A \rightarrow \varepsilon, где A \in N' и a \in T
 
* L(G') = L(G)
 
 
|proof=
 
|proof=
 
Сначала по G построим грамматику G'' = (N'', T, P'', S), как в доказательстве леммы 1. По G'' построим грамматику G', в которой:
 
Сначала по G построим грамматику G'' = (N'', T, P'', S), как в доказательстве леммы 1. По G'' построим грамматику G', в которой:

Версия 13:14, 4 января 2015

Определение:
Грамматика представлена в нормальной форме Куроды (англ. Kuroda normal form), если каждое правило имеет одну из четырех форм:
  1. [math]AB \rightarrow CD[/math]
  2. [math]A \rightarrow BC[/math]
  3. [math]A \rightarrow B[/math]
  4. [math]A \rightarrow a[/math] или [math]A \rightarrow \varepsilon[/math]
Где [math]A, B, C, D[/math] — нетерминалы, [math]a[/math] — терминал.


Данная грамматика названа в честь Куроды (англ. Sige-Yuki Kuroda), который изначально назвал ее линейно ограниченной грамматикой.


Определение:
Грамматика представлена в нормальной форме Пенттонена (англ. Penttonen normal form), если каждое правило имеет одну из трех форм:
  1. [math]AB \rightarrow CD[/math]
  2. [math]A \rightarrow BC[/math]
  3. [math]A \rightarrow a[/math] или [math]A \rightarrow \varepsilon[/math]
Где [math]A, B, C, D [/math] — нетерминалы, [math]a[/math] — терминал.


Также грамматику Пенттонена называют односторонней нормальной формой (англ. one-sided normal form). Как можно заметить, она является частным случаем нормальной формы Куроды: когда [math]A = C[/math] в первом правиле определения. Для каждой контестно-зависимой грамматики существует слабо эквивалентная ей грамматика в форме Пенттонена.

Лемма (об удалении терминалов):
Для любой грамматики [math]G = (N, T, P, S)[/math] может быть построена грамматика [math]G' = (N', T, P', S)[/math] такая, что:
  • все правила в [math]P'[/math] имеет вид [math]\alpha \rightarrow \beta[/math] где [math]\alpha \in (N')^+[/math] и [math]\beta \in (N')^*[/math] или [math]A \rightarrow a[/math], где [math]A \in N', a \in T[/math],
  • [math]L(G') = L(G)[/math]
Кроме того, если G контекстно-свободна или контекстно-зависима, то и [math]G'[/math] будет соответственно контекстно-свободной или контекстно-зависимой.
Доказательство:
[math]\triangleright[/math]

Каждому терминалу [math]a[/math] поставим в соотвествие новый символ [math]a'[/math], которого нет в [math]N \cup T[/math], такой что [math]a' \neq b'[/math] для разных терминалов [math]a[/math] и [math]b[/math].

Пусть [math]N' = N \cup \{a' | a \in T\}[/math].

Пусть [math]\alpha = x_1x_2...x_n[/math] — часть правила, тогда [math]\alpha' = y_1y_2...y_n[/math], где [math]y_i = \{x_i[/math], если [math]x_i \in N[/math]; [math]x_i'[/math], если [math]x_i \in T\}[/math] для [math]1 \lt = i \lt = n[/math].

Построим грамматику [math]G' = (N', T, P', S)[/math], где [math]P' = \{\alpha' \rightarrow \beta' : \alpha \rightarrow \beta \in P\} \cup \{a' \rightarrow a: a \in T\}[/math].

Покажем, что [math]L(G') = L(G)[/math].

Пусть [math]w \in L(G)[/math]. Тогда в G существует вывод [math]S = w_0 =\gt w_1 =\gt ... =\gt w_n =\gt w[/math].

Согласно конструкции [math]P'[/math], в [math]G'[/math] существует вывод [math]S = w_0' =\gt w_1' =\gt w_2' =\gt ... =\gt w_n' = v_0 =\gt v_1 =\gt v_2 =\gt ... =\gt v_m = w[/math].

Для [math]0 \lt = i \lt = n - 1[/math] в переходах [math]w_i' =\gt w_{i + 1}'[/math] используем правило [math]\alpha' \rightarrow \beta'[/math], так как правило [math]\alpha \rightarrow \beta[/math] было использовано при выводе [math]w_i =\gt w_{i + 1}[/math].

Для [math]0 \lt = j \lt = m - 1[/math] в переходах [math]v_j =\gt v_{j + 1}[/math] используем правила вида [math]a' \rightarrow a[/math].

Заменяем разрешенные в [math]w'[/math] символы на новые и получаем, что [math]w \in L(G')[/math]. Тогда [math]L(G) \lt = L(G')[/math].

Пусть [math]x \in L(G')[/math]. Тогда в [math]G'[/math] существует вывод [math]S =\gt * x[/math]. Мы можем поменять порядок применения правил в этом выводе: сначала применяем только правила вида [math]\alpha' \rightarrow \beta'[/math], а потом только правила вида [math]a' \rightarrow a[/math].

Из построения: после применения правила вида [math]a' \rightarrow a[/math] полученное [math]a[/math] не может быть использовано при применении правил из [math]P'[/math].

Изменение порядка вывода не меняет язык, то есть в [math]G'[/math] существует вывод: [math]S = x_0' =\gt x_1' =\gt ... =\gt x_r' =\gt x' =\gt y_1 =\gt y_2 =\gt ... =\gt y_s = x[/math], где для [math]0 \lt = i \lt = r - 1 x_{i + 1}' \in (N')^*[/math] и в переходе [math]x_i' \rightarrow x_{i + 1}'[/math] было использовано правило вывода [math]\alpha' \rightarrow \beta'[/math] и для [math]1 \lt = j \lt = s[/math] было использовано правило [math]a' \rightarrow a[/math], чтобы получить [math]y_j \rightarrow y_{j + 1}[/math].

Получаем вывод в [math]G[/math]: [math]S = x_0 =\gt x_1 =\gt ... =\gt x_n = x[/math]. Тогда [math]L(G') \lt = L(G)[/math]. Таким образом, [math]L(G') = L(G)[/math].

Очевидно, что если грамматика была неукорочивающейся, то она такой и останется.
[math]\triangleleft[/math]
Лемма (об удалении длинных правил):
Для любой грамматики [math]G = (N, T, P, S)[/math] может быть построена грамматика [math]G' = (N', T, P', S)[/math] такая, что:
  • любое правило из [math]P'[/math] имеет вид: [math]\alpha \rightarrow \beta[/math], где [math]\alpha \in (N')^+[/math] и [math]\beta \in (N')^+[/math] и [math]|\alpha| \lt = |\beta|[/math], или [math]A \rightarrow a[/math], или [math]A \rightarrow \varepsilon[/math], где [math]A \in N'[/math] и [math]a \in T[/math]
  • [math]L(G') = L(G)[/math]
Доказательство:
[math]\triangleright[/math]

Сначала по G построим грамматику G = (N, T, P, S), как в доказательстве леммы 1. По G построим грамматику G', в которой: N' = N U {D}, где D — новый символ,

P' получаем из P заменой всех правил вида \alpha \rightarrow \beta \in P, где
[math]\triangleleft[/math]


Определение:
Грамматика имеет порядок n, если


Лемма (об уменьшении порядка грамматики):
(Уменьшение порядка грамматики) Для любой грамматики G = (N, T, P, S) порядка n >= 3, такой что: любое правило из P' имеет вид \alpha \rightarrow \beta, где \alpha \in (N')^+ и \beta \in (N')^+ и
Доказательство:
[math]\triangleright[/math]

Разделим P на три подмножества:

P_1 = \{ \alpha \rightarrow \beta
[math]\triangleleft[/math]
Теорема:
Любую грамматику G можно преобразовать к грамматике G_K в нормальной форме Куроды, так что L(G) = L(G_K).
Доказательство:
[math]\triangleright[/math]

По лемме 1 построим из G грамматику G', затем по лемме 2 построим из G' грамматику G, Тогда G удовлетворит требованиям леммы 3. Пусть G имеет порядок n. Нсли n = 2, то G в нормальной форме Куроды и G_K = G. Если n >= 3, построим G порядка n - 1 из G по лемме 3.

Понятно, что G удовлетворяет условиям леммы 3, будем повторять процесс, пока не получим грамматику порядка 2, которую и примем за G_K.
[math]\triangleleft[/math]