Я намагаюся зрозуміти, що мається на увазі під "детермінованим" в таких виразах, як "детермінована граматика без контексту". (У цьому полі є детермінованіші "речі"). Я би вдячний прикладом більше, ніж найяскравішим поясненням! Якщо можливо.
Моє основне джерело плутанини - це не в змозі сказати, чим ця властивість граматики відрізняється від неоднозначності.
Найближчим чином я знайшов, що це означає, це цитата з статті Д. Кнут про переклад мов зліва направо :
Гінзбург і Грейбах (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 := ..., ми отримуємо ..., ..."