Я пытаюсь понять, что подразумевается под «детерминистическим» в выражениях, таких как «детерминистическая контекстно-свободная грамматика». (Есть более детерминированные «вещи» в этой области). Я был бы признателен за пример более, чем самое сложное объяснение! Если возможно.
Мой основной источник путаницы - неспособность понять, чем это свойство грамматики отличается от (не) двусмысленности.
Самое близкое, что я нашел, - это цитата из статьи Д. Кнута « О переводе языков слева направо» :
Гинзбург и Грейбах (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 := ...
...
Ответы:
PDA является детерминированным, следовательно, DPDA, если для каждой достижимой конфигурации автомата существует не более одного перехода (т. Е. Возможна не более одной новой конфигурации). Если у вас есть КПК, который может достигать некоторой конфигурации, для которой возможны два или более уникальных перехода, у вас нет DPDA.
Пример:
Это недетерминированные КПК, потому что исходная конфигурация -
q_0, Z0
достижима, и есть два допустимых перехода, ведущих от нее, если входной символ естьa
. Каждый раз, когда этот КПК начинает пытаться обработать строку, которая начинается сa
, есть выбор. Выбор означает недетерминированный.Вместо этого рассмотрим следующую таблицу переходов:
Вы можете испытать искушение сказать, что этот КПК недетерминирован; в конце концов, есть два допустимых перехода от конфигурации
q1, b(a+b)*
, например. Однако, поскольку эта конфигурация недоступна для любого пути через автомат, она не считается. Единственный достижимые конфигурации являются подмножествомq_0, (a+b)*Z0
,q1, a(a+b)*Z0
иq2, b(a+b)*Z0
, и для каждого из этих конфигураций, в лучшем случае один переход определен.CFL является детерминированным, если он является языком некоторого DPDA.
CFG является однозначным, если каждая строка имеет не более одного действительного деривации в соответствии с CFG. Иначе грамматика неоднозначна. Если у вас есть CFG, и вы можете создать два разных дерева деривации для какой-либо строки, у вас будет неоднозначная грамматика.
КЛЛ по своей сути неоднозначен, если он не является языком какого-либо однозначного КГЛ.
Обратите внимание на следующее:
источник
x+
- один или несколькоx
,(x)*
- ноль или болееx
?x+
обычно относится к «одному или нескольким из»x
, тогда какx*
обычно относится к «нулю или более изx
; Я могу использоватьxx*
вместоx+
, так как они идентичны.Вот примеры (из Википедии):
Свободный от контекста язык является детерминированным тогда и только тогда, когда существует хотя бы один детерминированный автомат, который принимает этот язык. (Там также может быть много недетерминированных автоматов, которые принимают язык, и он все равно будет детерминированным языком.) По сути, детерминированные автоматы с нажатием - это тот, где машинные переходы детерминированы на основе текущего состояния, входной символ и текущий верхний символ стека . детерминистическийздесь означает, что для любого состояния / входного символа / самого верхнего символа стека существует не более одного перехода состояния. Если у вас есть два или более следующих состояния для некоторого состояния / входного символа / тройного символа верхнего стека, то автомат является недетерминированным. (Вам нужно было бы «угадать», какой переход предпринять, чтобы решить, принимает ли автомат или нет.)
Что доказал Кнут, так это то, что каждая грамматика LR (k) имеет детерминированный автомат с нажатием и что каждый детерминированный автомат с понижением имеет грамматику LR (k). Таким образом, грамматики LR (k) и детерминированные автоматы нажатия могут обрабатывать один и тот же набор языков. Но набор языков, которые имеют детерминированный автомат, который принимает их, является (по определению) детерминированными языками. Аргумент не круглый.
Таким образом, детерминистический язык подразумевает, что существует однозначная грамматика. И мы показали однозначную грамматику, которая не имеет детерминированного автомата выталкивания (и, таким образом, это однозначная грамматика, которая принимает недетерминированный язык).
источник
К детерминированным контекстно-свободным языкам относятся те, которые принимаются некоторым детерминированным автоматом с нажатием (контекстно-свободными языками являются те, которые принимаются некоторым недетерминированным автоматом с понижением). Таким образом, это свойство языка, а не грамматики . Напротив, неоднозначность является свойством грамматики, в то время как присущая неоднозначность является свойством языка (контекстно-свободный язык по своей сути неоднозначен, если каждая не зависящая от контекста грамматика для языка неоднозначна).
Между этими двумя определениями существует связь: детерминированные контекстно-свободные языки никогда не бывают неоднозначными, как показано в ответе на этот вопрос .
источник
источник
Определения
Если каждая грамматика, которая генерирует КЛЛ, неоднозначна, то КЛЛ называется по сути неоднозначной . Таким образом, это не язык каких-либо однозначных CFG.
факты
Ответ на ваш вопрос (связь между детерминизмом и неоднозначностью)
(Не) двусмысленность относится в основном к грамматике (здесь CFGs). (Не) детерминизм относится как к грамматике, так и к автомату (здесь КПК).
Если вы хотите логических различий, вы можете посмотреть на последние четыре пункта в разделе фактов, поскольку они пытаются связать и двусмысленность, и детерминизм. Здесь я повторяю их снова:
КЛЛ, принятый некоторыми детерминированными КПК, по своей сути не является неоднозначным . (Существует по крайней мере один однозначный CFG для него.)
PS:
источник