Estou tentando entender o que se entende por "determinístico" em expressões como "gramática determinística livre de contexto". (Existem "coisas" mais determinísticas neste campo). Eu apreciaria um exemplo mais do que a explicação mais elaborada! Se possível.
Minha principal fonte de confusão é não poder dizer como essa propriedade de uma gramática é diferente da (não) ambiguidade.
O mais próximo que cheguei de encontrar o que significa é esta citação do artigo de D. Knuth Sobre a tradução de idiomas da esquerda para a direita :
Ginsburg e Greibach (1965) definiram a noção de uma linguagem determinística; mostramos na seção V que esses são precisamente os idiomas para os quais existe uma gramática LR (k)
que se torna circular assim que você chega ao Section V
, porque lá diz que o que o analisador LR (k) pode analisar é a linguagem determinística ...
Abaixo está um exemplo que eu poderia encontrar para me ajudar a entender o que "ambíguo" significa, por favor, dê uma olhada:
onewartwoearewe
Que pode ser analisado como one war two ear ewe
ou o new art woe are we
- se uma gramática permitir isso (digamos que tenha todas as palavras que acabei de listar).
O que eu precisaria fazer para tornar esse exemplo de linguagem (não) determinístico? (Eu poderia, por exemplo, remover a palavra o
da gramática, para torná-la não ambígua).
A linguagem acima é determinística?
PS. O exemplo é do livro Godel, Esher, Bach: Eternal Golden Braid.
Digamos que definimos a gramática para o idioma de exemplo da seguinte forma:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Pelo argumento de ter que analisar toda a cadeia, essa gramática torna a linguagem não determinística?
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'
ela não será mais ambígua ...S
. Pela aplicação da regraS := ...
, obtemos...
, ..."Respostas:
Um PDA é determinístico, portanto, um DPDA, se para todas as configurações acessíveis do autômato, há no máximo uma transição (ou seja, no máximo uma nova configuração possível). Se você possui um PDA que pode alcançar alguma configuração para a qual duas ou mais transições exclusivas podem ser possíveis, você não possui um DPDA.
Exemplo:
Estes são PDAs não determinísticos porque a configuração inicial -
q_0, Z0
- é alcançável e existem duas transições válidas que saem dela se o símbolo de entrada fora
. Sempre que esse PDA começa a tentar processar uma sequência que começa com uma
, há uma opção. Escolha significa não determinístico.Considere, em vez disso, a seguinte tabela de transição:
Você pode ficar tentado a dizer que esse PDA não é determinístico; Afinal, existem duas transições válidas fora da configuração
q1, b(a+b)*
, por exemplo. No entanto, como essa configuração não é alcançável por nenhum caminho através do autômato, ela não conta. As únicas configurações acessíveis são um subconjunto deq_0, (a+b)*Z0
,q1, a(a+b)*Z0
, eq2, b(a+b)*Z0
, e por cada uma dessas configurações, no máximo, uma transição é definida.Uma CFL é determinística se for o idioma de algum DPDA.
Um CFG é inequívoco se cada sequência tiver no máximo uma derivação válida, de acordo com o CFG. Caso contrário, a gramática é ambígua. Se você possui um CFG e pode produzir duas árvores de derivação diferentes para alguma sequência, possui uma gramática ambígua.
Uma CFL é inerentemente ambígua se não for o idioma de nenhuma CFG inequívoca.
Observe o seguinte:
fonte
x+
- um ou maisx
,(x)*
- zero ou maisx
?x+
tipicamente se refere a "um ou mais dex
, enquantox*
tipicamente se refere a" zero ou mais dex
; Eu posso usarxx*
no lugar dex+
, uma vez que estes são idênticos.Aqui estão alguns exemplos (da Wikipedia):
Uma linguagem livre de contexto é determinística se, e somente se, houver pelo menos um autômato de push determinístico que aceite essa linguagem. (Também pode haver muitos autômatos push-down não determinísticos que aceitam o idioma, e ainda assim seria um idioma determinístico.) Essencialmente, um autômato push-down determinístico é aquele em que as transições da máquina são deterministicamente baseadas no estado atual, o símbolo de entrada e o atual símbolo superior da pilha . Determinísticoaqui significa que não há mais de uma transição de estado para qualquer estado / símbolo de entrada / símbolo da pilha superior. Se você tiver dois ou mais estados seguintes para algum símbolo de estado / entrada / símbolo da pilha superior, triplicar, o autômato não é determinístico. (Você precisaria "adivinhar" qual transição realizar para decidir se o autômato aceita ou não.)
O que Knuth provou foi que toda gramática LR (k) possui um autômato de pushdown determinístico e que todo autômato de pushdown determinístico tem uma gramática LR (k). Portanto, gramáticas LR (k) e autômatos determinísticos de empilhamento podem lidar com o mesmo conjunto de idiomas. Mas o conjunto de idiomas que possuem um autômato de pushdown determinístico que os aceita são (por definição) os idiomas determinísticos. O argumento não é circular.
Portanto, a linguagem determinística implica que existe uma gramática inequívoca. E mostramos uma gramática inequívoca que não possui autômato de pushdown determinístico (e, portanto, é uma gramática inequívoca que aceita uma linguagem não determinística).
fonte
Linguagens livres de contexto determinísticas são aquelas que são aceitas por algum autômato de pushdown determinístico (linguagens livres de contexto são aquelas aceitas por algum autômato de pushdown não determinístico). Como tal, é uma propriedade de uma língua e não de uma gramática . Por outro lado, a ambiguidade é uma propriedade de uma gramática, enquanto a ambiguidade inerente é uma propriedade de uma linguagem (uma linguagem sem contexto é inerentemente ambígua se toda gramática sem contexto para a linguagem for ambígua).
Há uma conexão entre as duas definições: linguagens determinísticas livres de contexto nunca são inerentemente ambíguas, como mostra a resposta a esta pergunta .
fonte
fonte
Definições
Se todo gramática que gera CFL é ambígua, a CFL é chamada inerentemente ambígua . Portanto, não é o idioma de nenhum CFG inequívoco.
Fatos
Resposta à sua pergunta (relação entre determinismo e ambiguidade)
A (não) ambiguidade se aplica principalmente às gramáticas (aqui CFGs). O (não) determinismo se aplica às gramáticas e ao autômato (aqui PDAs).
Se você deseja diferenças lógicas, pode examinar os últimos quatro pontos na seção de fatos, enquanto eles tentam relacionar ambiguidade e determinismo. Aqui estou repetindo-os novamente:
Uma CFL aceita por alguns deterministas PDA não é inerentemente ambígua . (Existe pelo menos um CFG inequívoco para isso.)
PS:
fonte