J'essaie de comprendre ce que l'on entend par «déterministe» dans des expressions telles que «grammaire déterministe sans contexte». (Il y a des "choses" plus déterministes dans ce domaine). J'apprécierais un exemple plus que l'explication la plus élaborée! Si possible.
Ma principale source de confusion est de ne pas pouvoir dire en quoi cette propriété d'une grammaire est différente de (non) l'ambiguïté.
Le plus proche que j'ai pu trouver ce que cela signifie est cette citation de l'article de D. Knuth sur la traduction des langues de gauche à droite :
Ginsburg et Greibach (1965) ont défini la notion de langage déterministe; nous montrons dans la section V que ce sont précisément les langues pour lesquelles il existe une grammaire LR (k)
qui devient circulaire dès que vous arrivez à la Section V
, car là, il est dit que ce que l'analyseur LR (k) peut analyser est le langage déterministe ...
Vous trouverez ci-dessous un exemple que je pourrais trouver pour m'aider à comprendre ce que signifie «ambigu», veuillez jeter un œil:
onewartwoearewe
Qui peut être analysé comme one war two ear ewe
ou o new art woe are we
- si une grammaire le permet (disons qu'elle contient tous les mots que je viens d'énumérer).
Que devrais-je faire pour rendre cet exemple de langage (non) déterministe? (Je pourrais, par exemple, supprimer le mot o
de la grammaire, pour que la grammaire ne soit pas ambiguë).
Le langage ci-dessus est-il déterministe?
PS. L'exemple est tiré du livre Godel, Esher, Bach: Eternal Golden Braid.
Disons que nous définissons la grammaire de l'exemple de langue comme suit:
S -> A 'we' | A 'ewe'
A -> B | BA
B -> 'o' | 'new' | 'art' | 'woe' | 'are' | 'one' | 'war' | 'two' | 'ear'
Par l'argument d'avoir à analyser la chaîne entière, cette grammaire rend-elle le langage non déterministe?
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'
, alors ce ne sera plus ambigu ...S
. Par l'application de la règleS := ...
, nous obtenons...
, ..."Réponses:
Un PDA est déterministe, donc un DPDA, si pour chaque configuration accessible de l'automate, il y a au plus une transition (c'est-à-dire au plus une nouvelle configuration possible). Si vous avez un PDA qui peut atteindre une configuration pour laquelle deux ou plusieurs transitions uniques peuvent être possibles, vous n'avez pas de DPDA.
Exemple:
Ce sont des PDA non déterministes car la configuration initiale -
q_0, Z0
- est accessible, et il y a deux transitions valides qui s'éloignent si le symbole d'entrée esta
. Chaque fois que ce PDA commence à essayer de traiter une chaîne qui commence par una
, il y a un choix. Le choix signifie non déterministe.Considérez plutôt la table de transition suivante:
Vous pourriez être tenté de dire que ce PDA n'est pas déterministe; après tout, il y a deux transitions valides en dehors de la configuration
q1, b(a+b)*
, par exemple. Cependant, comme cette configuration n'est accessible par aucun chemin à travers l'automate, elle ne compte pas. Les configurations sont accessibles seulement un sous - ensembleq_0, (a+b)*Z0
,q1, a(a+b)*Z0
etq2, b(a+b)*Z0
, ainsi que pour chacune de ces configurations, tout au plus une transition est définie.Une LFC est déterministe si elle est la langue de certains DPDA.
Un CFG est sans ambiguïté si chaque chaîne a au plus une dérivation valide selon le CFG. Sinon, la grammaire est ambiguë. Si vous avez un CFG et que vous pouvez produire deux arbres de dérivation différents pour une chaîne, vous avez une grammaire ambiguë.
Un CFL est intrinsèquement ambigu si ce n'est le langage d'aucun CFG sans ambiguïté.
Notez les points suivants:
la source
x+
- un ou plusieursx
,(x)*
- zéro ou plusx
?x+
se réfère généralement à "un ou plusieurs dex
, tandis quex*
se réfère généralement à" zéro ou plusieurs dex
; Je peux utiliserxx*
à la place dex+
, car ils sont identiques.Voici des exemples (de Wikipedia):
Un langage sans contexte est déterministe si et seulement s'il existe au moins un automate déterministe déroulant qui accepte ce langage. (Il peut également y avoir beaucoup d'automates push-down non déterministes qui acceptent le langage, et ce serait toujours un langage déterministe.) Essentiellement, un automate push-down déterministe est celui où les transitions machine sont déterminées de manière déterministe en fonction de l'état actuel, le symbole d'entrée et le symbole le plus haut actuel de la pile . Déterministeici signifie qu'il n'y a pas plus d'une transition d'état pour un état / symbole d'entrée / symbole de pile supérieur. Si vous avez deux ou plusieurs états suivants pour un triple état / symbole d'entrée / symbole de pile supérieur, l'automate n'est pas déterministe. (Vous devez "deviner" la transition à effectuer pour décider si l'automate accepte ou non.)
Ce que Knuth a prouvé, c'est que chaque grammaire LR (k) a un automate déterministe de refoulement et que chaque automate déterministe pushdown a une grammaire LR (k). Ainsi, les grammaires LR (k) et les automates déterministes de refoulement peuvent gérer le même ensemble de langues. Mais l'ensemble des langages qui ont un automate de refoulement déterministe qui les accepte est (par définition) les langages déterministes. L'argument n'est pas circulaire.
Le langage déterministe implique donc qu'il existe une grammaire sans ambiguïté. Et nous avons montré une grammaire non ambiguë qui n'a pas d'automate pushdown déterministe (et donc c'est une grammaire non ambiguë qui accepte un langage non déterministe.)
la source
Les langages libres de contexte déterministes sont ceux qui sont acceptés par un automate de refoulement déterministe (les langages sans contexte sont ceux acceptés par certains automate de refoulement non déterministe). En tant que tel, c'est une propriété d'une langue plutôt que d'une grammaire . En revanche, l' ambiguïté est une propriété d'une grammaire, tandis que l'ambiguïté inhérente est une propriété d'une langue (une langue sans contexte est intrinsèquement ambiguë si chaque grammaire sans contexte de la langue est ambiguë).
Il existe un lien entre les deux définitions: les langages déterministes sans contexte ne sont jamais intrinsèquement ambigus, comme le montre la réponse à cette question .
la source
Peut-être qu'un exemple aiderait ici. Considérez le langage des cordes palindromiques sur{ a , b } , c'est à dire: { w ∈ ( a + b )∗∣ w = wR} . Ceci est généré par la grammaireS→ un Sa | b Sb | a | b | ϵ . Il s'agit d'une grammaire sans ambiguïté pour une langue sans ambiguïté. Un PDA acceptant cette langue pousserait simplementune 'le sable b est jusqu'à ce qu'il localise le milieu de la chaîne, peut-être en manger un une ou b (pour les chaînes de longueur impaire), puis correspondant une 'le sable b 's en lisant l'entrée et en faisant sauter la pile jusqu'à ce que les deux soient vides. Mais il n'y a aucun moyen de créer un PDA DETERMINISTIQUE pour cette langue, car il n'y a aucun moyen pour le PDA de localiser le centre de la chaîne sans deviner.
la source
Définitions
Si chaque grammaire qui génère CFL est ambiguë, alors la CFL est appelée intrinsèquement ambiguë . Il est donc pas la langue de toute GFR sans ambiguïté.
Les faits
Réponse à votre question (relation entre déterminisme et ambiguïté)
La (non) ambiguïté s'applique principalement aux grammaires (ici les CFG). Le (non) déterminisme s'applique à la fois aux grammaires et aux automates (ici les PDA).
Si vous voulez des différences logiques, vous pouvez regarder les quatre derniers points dans la section des faits car ils essaient de relier à la fois l'ambiguïté et le déterminisme. Ici, je les répète à nouveau:
Une LFC acceptée par certains PDA déterministes n'est pas intrinsèquement ambiguë . (Il existe au moins un CFG sans ambiguïté pour cela.)
PS:
la source