Я намагаюся зрозуміти, що мається на увазі під "детермінованим" в таких виразах, як "детермінована граматика без контексту". (У цьому полі є детермінованіші "речі"). Я би вдячний прикладом більше, ніж найяскравішим поясненням! Якщо можливо.
Моє основне джерело плутанини - це не в змозі сказати, чим ця властивість граматики відрізняється від неоднозначності.
Найближчим чином я знайшов, що це означає, це цитата з статті Д. Кнут про переклад мов зліва направо :
Гінзбург і Грейбах (1965) визначили поняття детермінованої мови; ми показуємо у розділі V, що це саме мови, для яких існує граматика LR (k)
що стає круговим, як тільки ви дістаєтесь до Section V
, тому що там написано, що те, що LR (k) може розбирати, - це детермінована мова ...
Нижче наведено приклад, який я міг би знайти, щоб допомогти мені зрозуміти, що означає "амбітний", будь ласка, погляньте:
onewartwoearewe
Який можна проаналізувати як one war two ear ewe
або o new art woe are we
- якщо граматика дозволяє це (скажіть, у ньому є всі слова, які я щойно перерахував).
Що мені потрібно зробити, щоб зробити цей приклад мовою (не) детермінованою? (Я міг би, наприклад, вилучити слово o
з граматики, зробити граматику неоднозначною).
Чи є детермінованою вищезгадана мова?
PS. Приклад із книги Годель, Ешер, Бах: Вічна золота коса.
Скажімо, ми визначаємо граматику для прикладної мови так:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Аргумент про необхідність розбору цілого рядка, чи робить ця граматика мову недетермінованою?
let explode s =
let rec exp i l =
if i < 0 then l else exp (i - 1) (s.[i] :: l) in
exp (String.length s - 1) [];;
let rec woe_parser s =
match s with
| 'w' :: 'e' :: [] -> true
| 'e' :: 'w' :: 'e' :: [] -> true
| 'o' :: x -> woe_parser x
| 'n' :: 'e' :: 'w' :: x -> woe_parser x
| 'a' :: 'r' :: 't' :: x -> woe_parser x
| 'w' :: 'o' :: 'e' :: x -> woe_parser x
| 'a' :: 'r' :: 'e' :: x -> woe_parser x
(* this line will trigger an error, because it creates
ambiguous grammar *)
| 'o' :: 'n' :: 'e' :: x -> woe_parser x
| 'w' :: 'a' :: 'r' :: x -> woe_parser x
| 't' :: 'w' :: 'o' :: x -> woe_parser x
| 'e' :: 'a' :: 'r' :: x -> woe_parser x
| _ -> false;;
woe_parser (explode "onewartwoearewe");;
- : bool = true
| Label | Pattern |
|---------+--------------|
| rule-01 | S -> A 'we' |
| rule-02 | S -> A 'ewe' |
| rule-03 | A -> B |
| rule-04 | A -> BA |
| rule-05 | B -> 'o' |
| rule-06 | B -> 'new' |
| rule-07 | B -> 'art' |
| rule-08 | B -> 'woe' |
| rule-09 | B -> 'are' |
| rule-10 | B -> 'one' |
| rule-11 | B -> 'war' |
| rule-12 | B -> 'two' |
| rule-13 | B -> 'ear' |
#+TBLFM: @2$1..@>$1='(format "rule-%02d" (1- @#));L
Generating =onewartwoearewe=
First way to generate:
| Input | Rule | Product |
|-------------------+---------+-------------------|
| '' | rule-01 | A'we' |
| A'we' | rule-04 | BA'we' |
| BA'we' | rule-05 | 'o'A'we' |
| 'o'A'we' | rule-04 | 'o'BA'we' |
| 'o'BA'we' | rule-06 | 'onew'A'we' |
| 'onew'A'we' | rule-04 | 'onew'BA'we' |
| 'onew'BA'we' | rule-07 | 'onewart'A'we' |
| 'onewart'A'we' | rule-04 | 'onewart'BA'we' |
| 'onewart'BA'we' | rule-08 | 'onewartwoe'A'we' |
| 'onewartwoe'A'we' | rule-03 | 'onewartwoe'B'we' |
| 'onewartwoe'B'we' | rule-09 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
| | | 'onewartwoearewe' |
Second way to generate:
| Input | Rule | Product |
|-------------------+---------+-------------------|
| '' | rule-02 | A'ewe' |
| A'ewe' | rule-04 | BA'ewe' |
| BA'ewe' | rule-10 | 'one'A'ewe' |
| 'one'A'ewe' | rule-04 | 'one'BA'ewe' |
| 'one'BA'ewe' | rule-11 | 'onewar'A'ewe' |
| 'onewar'A'ewe' | rule-04 | 'onewar'BA'ewe' |
| 'onewar'BA'ewe' | rule-12 | 'onewartwo'A'ewe' |
| 'onewartwo'A'ewe' | rule-03 | 'onewartwo'B'ewe' |
| 'onewartwo'B'ewe' | rule-13 | 'onewartwoearewe' |
|-------------------+---------+-------------------|
| | | 'onewartwoearewe' |
B -> 'o'
, тоді, вона вже не буде неоднозначною ...
S
. Застосовуючи правило S := ...
, ми отримуємо ...
, ..."