Como a não ambiguidade é diferente do determinismo?


13

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 eweou 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 oda 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' |

1
-1, já que a questão agora faz pouco sentido. Primeiro, uma string não é um idioma; strings não são ambíguas, inequívocas, determinísticas ou não determinísticas; são apenas cordas. A gramática que você fornece não gera a sequência de exemplo. Não verifiquei todas as 180 derivações para ver se há duplicatas, mas, em teoria, é tudo o que você precisa fazer para verificar se a gramática é ambígua. Infelizmente, o idioma não pode ser inerentemente ambíguo, uma vez que o idioma é finito, portanto regular, portanto aceito por um DPDA, portanto determinístico.
Patrick87

@ Patrick87 eh? Onde diz que a string é o idioma? Essa sequência é um exemplo de produto e, com certeza, é possível gerar usando a gramática fornecida. O que faz você pensar o contrário? A string em questão é exatamente o caso, em que duas seqüências diferentes de aplicativos de regra produzem a mesma string, portanto a gramática é ambígua, mas se você remover algumas regras (por exemplo, B -> 'o'ela não será mais ambígua ...
wvxvw

Primeiro, você pode fornecer uma derivação da sequência de exemplo usando a gramática? Da sua própria pergunta: "A linguagem acima é determinística?" Você nunca nomeia um idioma, apenas uma sequência, gerada por uma infinidade de gramáticas, embora não a que você propõe.
Patrick87

Você pode escrever em inglês? Por exemplo, "Comece com S. Pela aplicação da regra S := ..., obtemos ..., ..."
Patrick87 25/13

@ Patrick87 Adicionei um procedimento de geração passo a passo e percebi que cometi um erro na gramática, que corrigi.
Wdxvw # 26/13

Respostas:


9

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:

Q={q0,q1}Σ=Γ={a,b}A=q0 0δ fornecidos pela tabela a seguir:

q    e    s    q'   s'
--   --   --   --   --
q0   a    Z0   q1   aZ0
q0   a    Z0   q2   bZ0
...

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 um a, há uma opção. Escolha significa não determinístico.

Considere, em vez disso, a seguinte tabela de transição:

q    e    s    q'   s'
--   --   --   --   --
q0   a    Z0   q1   aZ0
q0   a    Z0   q2   bZ0
q1   a    a    q0   aa
q1   a    b    q0   ab
q1   a    b    q2   aa
q2   b    a    q0   ba
q2   b    b    q0   bb
q2   b    a    q1   bb

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 de q_0, (a+b)*Z0,q1, a(a+b)*Z0 , e q2, 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:

  • Uma CFL determinística deve ser o idioma de alguns DPDA.
  • Cada CFL é a linguagem de infinitamente muitos PDAs não determinísticos.
  • Uma CFL inerentemente ambígua não é o idioma de nenhuma CFG inequívoca.
  • Cada CFL é a linguagem de infinitos CFGs ambíguos.
  • Uma CFL inerentemente ambígua não pode ser determinística.
  • Uma CFL não determinística pode ou não ser inerentemente ambígua.

1
O Wiki diz que o PDA não é determinístico (pode haver uma versão determinística e um não determinístico), mas você também pode omitir a primeira parte da frase, não está realmente contribuindo para o que está dizendo: / Mas, novamente, isso define uma linguagem determinística como uma linguagem de entrada de algo determinístico, e que algo é chamado determinístico porque aceita linguagem determinística - é como dizer "a grama é verde porque verde é a cor da grama". É verdade, mas não é útil :( Por favor, exemplo seria mais do que precioso!
wvxvw

@ wvxvw: você não está lendo isso corretamente. Ele diz: "Um PDA é determinístico se, e somente se, cada estado / símbolo / empilhamento triplo tiver apenas um próximo estado". Não há nada nessa definição sobre qual idioma o autômato aceita.
Wandering Logic

2
@wvxvw A definição de PDA determinístico, ou DPDA, que não dou de forma, forma ou forma, depende da definição de uma linguagem livre de contexto determinístico. Defino DPDAs com base apenas nas propriedades do autômato. Em seguida, defino o que é uma CFL determinística em termos da definição de um DPDA. Leia novamente a resposta à luz destes e dos comentários da Wandering Logic e tente ver se isso faz sentido. Vou me esforçar para fornecer alguns breves exemplos.
Patrick87

q1,b(a+b)q2,b(a+b)Q={q0,...q2}o personagem atual? Além disso, minha interpretação está correta? x+- um ou mais x, (x)*- zero ou mais x?
Wvxvw

@wvxvw A configuração refere-se ao estado atual e ao conteúdo atual da pilha. x+tipicamente se refere a "um ou mais de x, enquanto x*tipicamente se refere a" zero ou mais de x; Eu posso usar xx*no lugar de x+, uma vez que estes são idênticos.
precisa saber é o seguinte

7

Aqui estão alguns exemplos (da Wikipedia):

S0S0|1S1|ε

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).

{anbmcmdn|n,m>0}{anbncmdm|n,m>0}{anbnccdn|n>0}


Você pode, por favor, explicar por que ter que olhar para toda a cadeia antes de determinar o meio torna essa linguagem não determinística? Li outra explicação sobre o que é "determinístico" e, ali, diz que "se você não precisa voltar atrás ao analisar, essa linguagem é determinística". Eu não vejo a necessidade de recuar para analisar essa linguagem ...
wvxvw

1
Considere a sequência de entrada "10011001". O autômato de empilhamento não sabe quanto tempo a string dura até chegar ao fim. Quando você chega ao segundo 0, precisa fazer uma escolha: essa é a sequência de quatro caracteres "1001" ou uma sequência mais longa que se parece com "100 ???? 001"? Quando você chega ao quinto caractere, ainda não sabe: essa é a sequência de 8 caracteres "10011001" ou uma sequência mais longa que se parece com "10011 ???? 11001"?
Wandering Logic

1
A coisa "analisar toda a cadeia" não é a definição de não determinística. Era apenas uma intuição que eu estava tentando acrescentar. Tanto @ Patrick87 quanto eu lhe demos a definição real de determinístico: de cada estado existe no máximo um próximo. Se um idioma não possui gramática inequívoca, deve ser não determinístico. Não posso responder sobre o seu exemplo sem fazer mais trabalho: você mostrou uma gramática ambígua, mas não é isso que importa, você precisa demonstrar que não gramática inequívoca se quiser mostrar que o idioma é inerentemente ambíguo.
Wandering Logic

1
@wvxvw Se você está procurando um procedimento computacional, provavelmente está sem sorte ... de acordo com en.wikipedia.org/wiki/List_of_undecidable_problems , é indecidível se um CFG é ambíguo, muito menos se seu idioma é inerentemente ambíguo ; também é indecidível se um CFG gera todas as strings. Diante disso, duvido seriamente que seja decidível e muito menos eficiente decidir se a linguagem de um CFG é uma CFL determinística.
Patrick87

1
@wvxvw Se você tiver a mesma sorte, está lidando com o que chamamos de um caso feliz, ou seja, não um dos casos que faz deste um problema indecidível. Você pode definir heurísticas que funcionam para muitos casos felizes e não explodem no resto, mas elas não funcionam em todos os casos felizes; se o fizessem, você teria uma decisão para o problema, que por nossa premissa é impossível.
Patrick87

5

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 .


Desculpe, isso não é muito útil. Na verdade, eu comecei com o DPDA, mas nunca explica por que é chamado determinístico. Essa é uma definição fácil de encontrar na Wikipedia / Google para outros artigos. Mas que propriedade da gramática / idioma / analisador é descrita pela palavra "determinista"? Em outras palavras, o que deve acontecer na gramática para que seja chamada determinística?
Wvxvw

Desculpe, se eu comentar demais. A confusão é porque eu não consigo distinguir, digamos, de alguma linguagem, determinística ou não, e não sei por onde começar a identificar o "determinismo" da linguagem. Um exemplo de uma linguagem determinística e depois alterada da maneira que a torna não determinística seria imensamente útil.
Wvxvw

1
euR(k)

1
Desculpe, ainda não é útil. Entendo o que você está dizendo, mas não me ajuda a reconhecer uma linguagem que é determinística e diferenciá-la de não-determinística. Para dar um exemplo: se um idioma possui uma regra de produção que cria um problema de parêntese balanceado, eu sei imediatamente que ele não pode ser analisado pelo FSM. (Porque exigiria uma pilha). Mas quando você menciona outro formalismo, ele fica recursivo, não está me ajudando a entender como essa linguagem deve diferir de outra.
Wvxvw # 25/13

Em outras palavras (como você mencionou em um comentário anterior), você deseja exemplos de linguagens determinísticas e não determinísticas sem contexto da mesma "classificação". Talvez você deva fazer uma pergunta focada sobre isso.
Yuval Filmus

1

{uma,b}{W(uma+b)W=WR}SumaSuma|bSb|uma|b|ϵumabumabumab


1

Definições

  1. Um aceitador de pushdown determinístico (DPDA) é um autômato de pushdown que nunca tem uma escolha em sua jogada.
  2. DPDA e NPDA não são equivalentes.
  3. Um CFG não é determinístico se houver pelo menos duas produções com o mesmo prefixo de terminal no lado direito delas.
  4. Um CFG é ambíguo se existir algum w ∈ L (G) que tenha pelo menos duas árvores de derivação distintas. Assim, possui duas ou mais derivações mais à esquerda ou mais à direita, correspondentes a duas árvores de derivação diferentes.
  5. Um CFG é inequívoco se cada string tiver no máximo uma derivação válida, de acordo com o CFG. Caso contrário, a gramática é ambígua.
  6. Uma CFL é inerentemente ambígua se não for o idioma de nenhuma CFG inequívoca. Não pode ter nenhum DPDA.
    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

  1. Cada CFL é a linguagem de infinitamente muitos PDAs não determinísticos.
  2. Cada CFL é a linguagem de infinitamente muitos CFGs ambíguos.
  3. Uma CFL aceita por algum DPDA não é inerentemente ambígua. (Existe pelo menos um CFG inequívoco para isso.)
  4. Uma CFL aceita pelo NDPDA pode ou não ser inerentemente ambígua, pois pode existir algum DPDA (ou CFG inequívoco) para ela.
  5. Uma CFL gerada por CFG ambígua pode ou não ser inerentemente ambígua, pois pode existir algum CFG não ambíguo (ou DPDA) para ele.
  6. Uma CFL gerada por pelo menos um CFG não ambígua não é inerentemente ambígua. (Existe algum DPDA para isso.)
  7. Uma gramática não determinística pode ou não ser ambígua.

Resposta à sua pergunta (relação entre determinismo e ambiguidade)

  1. 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:

  2. Uma CFL aceita por alguns deterministas PDA não é inerentemente ambígua . (Existe pelo menos um CFG inequívoco para isso.)

  3. Uma CFL aceita por PDA não determinístico pode ou não ser inerentemente ambígua, pois pode existir algum DPDA (ou CFG inequívoco ) para ela.
  4. Uma CFL gerada por CFG ambígua pode ou não ser inerentemente ambígua, pois pode existir alguma CFG não ambígua (ou determinística PDA ) para ele.
  5. Uma CFL gerada por pelo menos uma inequívoca CFG não é inerentemente ambígua . (Existe algum DPDA para isso.)
  6. Uma gramática não determinística pode ou não ser ambígua .

PS:

  1. A resposta aceita usa linhas como "CFL é determinístico", "CFL determinístico", "CFL não pode ser determinístico", "Uma CFL não determinística". Eu acho que os adjetivos "determinístico" e "ambíguo" não se aplicam à CFL, mas ao PDA e CFG (embora o adjetivo "inerentemente ambíguo" se aplique à CFL). Embora eu não queira criticar a resposta original, como aprendi crucial pontos dele. (De fato, eu literalmente copiei e colei algumas linhas dessa resposta.) Mas ainda achava que deveria ser corrigido. Então, tentei colocar os itens de maneira mais clara aqui em duas partes, definições e fatos (eu poderia ter tornado desnecessariamente detalhado e longo). Acho que deveria ter editado a resposta original, mas isso envolverá a exclusão de muitos pontos que usam as linhas acima. E não sei se isso tornará a edição válida, pois envolve a reescrita completa.
  2. Observe que coloquei palavras quantitativas em negrito e itálico para destacar diferenças comparativas em diferentes definições e fatos. Os termos de definição são apenas em negrito .
  3. Eu me formei alguns pontos, então precisarei de confirmação de alguém com conhecimento aqui sobre a correção de cada ponto.

O PS 1 está errado: existe uma definição padrão para CFLs determinísticas / ambíguas, ou seja, elas são definidas como aquelas para as quais todos os CFGs são determinísticos / ambíguos.
Reinierpost

apenas percebi que o fato 7 está errado. Também o ponto 6 da segunda última lista é o mesmo e está errado.
Maha

De fato ... o determinismo não tem ambiguidade em nenhum momento durante a análise, portanto é estritamente mais forte que a ambiguidade (isto é, ambiguidade mesmo após a conclusão da análise).
reinierpost
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.