LINGUAGGI E GRAMMATICHE FORMALI I LINGUAGGI IN

LINGUAGGI E GRAMMATICHE FORMALI
I LINGUAGGI IN INFORMATICA
•
•
•
Presenti in tutte le applicazioni
Fondamentali nel software di sistema
Paradigmatici nella teoria
“molti importanti problemi teorici son riconducibili al
problema dell'appartenenza di una stringa a un linguaggio”
GRAMMATICHE FORMALI
Metodo di costruzione delle stringhe del linguaggio basato sulla riscrittura.
Approccio generativo alla descrizione dei linguaggi.
1914
1943
1947
1956
1960
Axel Thue
studia i primi problemi di riscrittura.
Emil Post
definisce sistemi di produzione (lavori del 1920).
Markov
definisce algoritmi basati su regole di riscrittura.
N. Chomsky
introduce le grammatiche formali nell'ambito degli studi sul
linguaggio naturale.
J. W. Backus e P. Naur introducono la BNF per descrivere la sintassi del
linguaggio Algol.
tipo 0
tipo 1 - Context Sensitive
tipo 2 – Context Free
lineari
tipo 3 - Regolari
Le Grammatiche di Chomsky
Def. Una grammatica formale è un sistema G = <VT,VN, P, S> caratterizzato da:
• VT
• VN
•P
alfabeto finito di simboli detti terminali
alfabeto finito di simboli detti non terminali (categorie sintattiche)
Se indichiamo con V l’insieme VT ∪ VN
detto insieme di produzioni, e’ un sottoinsieme finito del prodotto
cartesiano:
(V*° VN ° V*) x V*
Un elemento < α, β > ∈ P si indica con α → β
• S ∈ VN è detto assioma.
Il linguaggio generato da una grammatica è l'insieme delle stringhe di terminali
ottenibili, a partire dall’assioma, con una sequenza finita di passi di riscrittura
consistenti nell'applicazione delle regole di produzione.
Es. La grammatica G = <{a, b, c},{S, B, C}, P, S> con P insieme delle seguenti
produzioni:
S → aS
S→B
B → bB
B → bC
C → cC
C→c
genera il linguaggio:
L(G) = {an bm ch | n ≥ 0, m, h ≥1}
In forma più sintetica (derivata dalla BNF) si usa indicare:
α → β1
........
α → βn
con
α → β1 | ........ | βn
Le produzioni precedenti si indicano allora con:
S → aS | B
B → bB | bC
C → cC | c
Def. Sia <φ, ψ> un elemento in (V*° VN ° V*) x V*. Si dice che ψ è derivabile
direttamente (in un solo passo) da φ (e si scrive φ ⇒ ψ ) se esistono in V* parole
α, β, γ, δ tali che φ = γαδ, ψ = γβδ e si ha che α→β ∈ P. Si parla di derivazione
diretta (in un solo passo).
Def. Sia <φ, ψ> un elemento in (V*° VN ° V*) × V*. Si dice che ψ è derivabile da φ
(e si scrive φ ⇒* ψ ) se esiste una sequenza di stringhe φ1,..., φn ∈ V* tali φi ⇒ φi+1 ,
∀i=1,..,n-1, con φ1 = φ e φn = ψ. Si parla di derivazione di ψ da φ. Inoltre per
qualsiasi stringa φ ∈ V*, φ ⇒* φ.
Def. Una stringa x ∈V* tale che S ⇒*x è detta forma di frase.
Def. Il linguaggio generato da G è l'insieme delle forme di frase costituite di soli
terminali cioè:
L(G) = {x | x ∈VT * e S ⇒*x }.
N. B. Non è detto che una derivazione porti ad una stringa del linguaggio; essa può
portare ad una forma di frase in cui non si può più applicare alcuna produzione.
Def. Due grammatiche G1 e G2 si dicono equivalenti se L(G1 ) = L(G2).
Es. La grammatica G = < {a, b},{S, A}, P, S > con le produzioni:
S → aA | b
A → aS
e la grammatica G = < {a, b},{S, A}, P, S > con le produzioni:
S → Ab | b
A → aAa | aa
e la grammatica G = < {a, b},{S, A}, P, S > con le produzioni:
S → Ab
A → Aaa | ε
generano lo stesso linguaggi {an b | n ≥ 0 e pari} e quindi sono equivalenti.
Es. G = <{a, b, c},{S, A, B, C}, P, S> con le produzioni:
1 S → aSBC
2 S → aBC
3 CB
→ BC
4 aB
→ ab
5 bB
→ bb
6 bC
→ bc
7 cC
→ cc
genera il linguaggio {anbncn | n≥1}.
La seguente derivazione genera 'aaabbbccc' :
S (1) ⇒
aSBC
(1) ⇒
aaSBCBC
(2) ⇒
aaaBCBCBC
(3) ⇒
aaaBCBBCC
(3) ⇒
aaaBBCBCC
(3) ⇒
aaaBBBCCC
(4) ⇒
aaabBBCCC
(5) ⇒
aaabbBCCC
(5) ⇒
aaabbbCCC
(6) ⇒
aaabbbcCC
(7) ⇒
aaabbbccC
(7) ⇒
aaabbbccc
N.B. se non si completano gli scambi si può arrivare alla forma di frase aaabcBBCC
alla quale non si applica alcuna produzione.
Es. La grammatica G = <{a, b, c},{S, A}, P, S> con le produzioni:
S → aSc | aAc
A → bAc | ε
genera {anbmcn+m | n ≥ 1, m ≥ 0}.
Es. La grammatica G = <{a, b, c},{S, A}, P, S> con con le produzioni:
S → Ab
A → Sa
genera Λ.
CLASSI DI GRAMMATICHE DI CHOMSKY
•
di tipo 0
•
di tipo 1 contestuali
(context sensitive: CS)
•
di tipo 2 non contestuali
(context free:
•
di tipo 3 regolari
CF)
Def. Def. Le grammatiche di Chomsky di tipo 0 sono basate sulle produzioni più
generali, del tipo:
α→β
con α ∈ V*° VN ° V*
β ∈ V*
N.B. Le produzioni di tipo 0 possono accorciare le forme di frase.
Def. I linguaggi di tipo 0 sono i linguaggi generati da grammatiche di tipo 0.
Def. Le grammatiche di Chomsky di tipo 1 sono basate su produzioni del tipo:
α→β
con
α ∈ V*° VN ° V*
β ∈ V+ e con
|α| ≤| β|
N.B. Le produzioni di tipo 1 non riducono la lunghezza delle forme di frase.
Def. I linguaggi di tipo 1 (contestuali) sono i linguaggi generati da grammatiche di
tipo 1.
- Es. Il linguaggio appena generato {anbncn | n≥1} con una grammatica di tipo 1può
anche essere generato dalla seguente grammatica di tipo 0 con produzioni:
S → aSBC
CB → BC
SB → bF
FB → bF
FC → cG
GC → cG
G→ε
Il linguaggio è anche di tipo 1 perchè la precedente grammatica è di tipo 1.
Non è invece generabile con grammatiche di tipo 2 (ma non lo dimostremo).
Def. Le grammatiche di Chomsky di tipo 2 sono basate su produzioni del tipo:
+
A→β
con
A ∈ VN
β∈V
Def. I linguaggi di tipo 2 (context free o non contestuali) sono i linguaggi generati
da grammatiche di tipo 2.
Una derivazione in questo tipo di grammatiche è rappresentabile con un albero di
derivazione.
Es. Il linguaggio {anbn | n≥1} è di tipo 2 in quanto può essere generato dalla
grammatica con le produzioni:
S → aSb | ab
Es. Grammatica CF che genera il linguaggio delle parentesi ben bilanciate:
B → () | BB | (B)
Dare una derivazione per la stringa di parentesi: ()((()())).
Es. Grammatica CF che genera tutte le stringhe palindrome sull'alfabeto {0, 1}.
P → 0 | 00 | 1 | 11 | 0P0 | 1P1
Es. Grammatica che genera semplici espressioni aritmetiche, con operatori in {+ ,∗},
parentesi tonde, ed operandi scritti con caratteri in {a,b,0,1} e che iniziano con la
lettera a oppure b:
E → I | E+E | E∗E | (E)
I → a | b | Ia | Ib |I0 | I1
Bastano due variabili (E per rappresenta le espressioni, I gli identificatori).
Il “linguaggio di I” è il linguaggio definito dalll’espressione regolare:
(a+b)(a+b+0+1)*
Derivazione (“a sinistra”) della stringa a ∗ (a + b00):
E ⇒ E ∗ E ⇒ I ∗ E ⇒ a ∗ E ⇒ a ∗ (E) ⇒ a ∗ (E+E) ⇒ a ∗ (I+E) ⇒ a ∗ (a+E)
⇒ a ∗ (a+I) ⇒ a ∗ (a+I0) ⇒ a ∗ (a+I00) ) ⇒ a ∗ (a+b00)
Esiste anche una derivazione “a destra”, che è la seguente:
E ⇒ E ∗ E ⇒ E ∗ (E) ⇒ E ∗ (E+E) ⇒ E ∗ (E+I)
⇒ E ∗ (E+I0) ⇒ E ∗ (E+I00) ⇒ E ∗ (E+b00) ⇒ E ∗ (I+b00)
⇒ E ∗ (a+b00) ⇒ I ∗ (a+b00) ⇒ a ∗ (a+b00)
Una derivazione individua un “albero sintattico”. Le due precedenti individuano lo
stesso albero. L’esistenza di derivazioni distinte per una stessa stringa non comporta
di per sè un male per la grammatica se gli alberi sintattici sono identici. Ma se in una
grammatica esistono alberi sintattici “distinti” con lo stesso “prodotto” (la
grammatica viene detta ambigua) questo è problematico. Ad es. la forma
sentenziale E +E ∗ E ha due alberi sintattici distinti:
E ⇒ E + E ⇒ E + E∗E
E ⇒ E ∗ E ⇒ E + E∗E
Una grammatica non ambigua (e non è affatto evidente che lo sia) che genera le
espressioni di quest'ultimo esempio ha le prime produzioni sostituite dalle seguenti:
E → E+T | T
T → T∗F |F
F → (E) | I
(T non è più scomponibile per il +, F non lo è per il * ed il +, Vedi HMU).
Non esiste un algoritmo che dice se una grammatica CF è ambigua.
Esistono linguaggi CF che sono inerentemente ambigui, cioè ogni grammatica CF
che li genera è ambigua.
In grammatiche non ambigue le derivazioni non sono necessariamente uniche ma si
può dimostrare che le derivazioni sinistre ( e quelle destre) sono uniche.
Prima di definire le grammatiche di tipo 3 riconsideriamo quelle di tipo 1.
Nell'originaria formulazione data da Chomsky le grammatiche di tipo 1 sono
definite con produzioni della forma più restrittiva (contestuale secondo Chomsky):
+
α→β
con α = φ1Α φ2 , β = φ1γφ2 , Α ∈VN , φ1, φ2 ∈V*, γ ∈V
Quindi, se |φ1| ≥ 1 o |φ2| ≥ 1, la produzione esprime il fatto che il non terminale A
viene rimpiazzato dalla stringa γ solo se appare “nel contesto” delle stringhe φ1 e φ2.
Da qui l’origine del nome.
Oss. Nella grammatica di tipo 1 che genera il linguaggio {anbncn | n≥1} le
produzioni: aB→ab, bB→bb, bC→bc, cC→cc e le produzioni: S→aSBC | aBC sono
contestuali secondo Chomsky, mentre CB→BC non lo è.
Teorema. Le grammatiche di tipo 1 e le grammatiche con produzioni contestuali
secondo Chomsky generano la stessa classe di linguaggi.
Dim.
i) Le produzioni contestuali di Chomsky sono di tipo 1.
ii) Le produzioni di tipo 1 possono essere trasformate in produzioni contestuali di
Chomsky.
Prima occorre ridursi ad una grammatica con produzioni senza simboli terminali a
sinistra (sostituendo simboli terminali con non terminali ed opportune produzioni,
come ad es. sostituendo a con A e poi aA → b con AA → b e A → a).
Poi si procede come illustrato nel seguente esempio dove la produzione:
CBA →EFGHT puo' essere trasformata nella sequenza:
CBA →CBX
CBX→EBX
EBX→EFX
EFX →EFGHT
Def. Le grammatiche di Chomsky di tipo 3 sono basate su produzioni del tipo:
A → aB oppure
A→a
con a ∈ VT , A, B ∈ VN.
Def. I linguaggi di tipo 3 (regolari) sono quelli generati da grammatiche di tipo 3.
Le grammatiche di tipo 3 sono lineari destre (LD). Lineari perchè nel lato destro di
ogni produzione compare al più un solo metasimbolo; destre perchè il metasimbolo
compare a destra dell'unico simbolo terminale.
Si possono anche definire grammatiche di tipo 3 lineari sinistre (LS) con produzioni
del tipo:
A→Ba
oppure
A→a
con a ∈ VT , A, B ∈VN.
Es. Il linguaggio {anb | n ≥ 0} è di tipo 3 in quanto è generato dalla grammatica (LD)
con le produzioni:
S → aS | b
Es. Il linguaggio {anb | n ≥ 0} puo' essere anche generato da una grammatica lineare
sinistra con le seguenti produzioni:
S → Tb | b
T → Ta | a
Teorema. I linguaggi generabili con grammatiche LD e LS coincidono con la classe
dei linguaggi regolari.
LINGUAGGI LINEARI
I linguaggi lineari sono linguaggi CF generati da grammatiche lineari, cioè
grammatiche dove la parte destra di ogni produzione contiene al più un metasimbolo.
Es. La grammatica S → aSb | c che genera {ancbn | n≥0} è lineare.
I linguaggi lineari sono un sottoinsieme di quelli CF e un soprainsieme di quelli
regolari.
Def. Un linguaggio è strettamente di Tipo n se esiste una grammatica di tipo n che
lo genera e non esiste nessuna grammatica di tipo m>n che lo genera.
Es.
– Il linguaggio
– Il linguaggio
{anbncn | n ≥ 1}
{anbn | n ≥ 1}
è strettamente di tipo 1.
è strettamente di tipo 2.
N.B.. La dimostrazione dei suddetti risultati richiede tecniche che discuteremo più
avanti. Anche per mostrare linguaggi strettamente di tipo 0 abbiamo bisogno di
introdurre ulteriori concetti.
Vedremo anche che se L è un linguaggio generato da una grammatica ambigua di
tipo 3, esiste una grammatica di tipo 3 non ambigua che genera L. Basterà costruire
l'automa deterministico che riconosce L; la relativa grammatica non è ambigua.
FORMA NORMALE DI BACKUS-NAUR (BNF)
(introdotta da Backus e Naur per dare la definizione sintattica dell’Algol)
La BNF è una notazione per grammatiche CF resa più espressiva e succinta con
alcuni accorgimenti, vagamente ispirati alle espressioni regolari.
Le seguenti produzioni con la notazione delle grammatiche CF:
<sequenza istruzioni> → <istruzione> | <istruzione> ; <sequenza istruzioni>
<istruzione if> → if <predicato> then <proposizione> else <proposizione> |
if <predicato> then <proposizione>
sarebbero scritte in BNF così:
<sequenza istruzioni> ::= <istruzione> {; <istruzione>}
<istruzione if> ::= if <predicato> then <proposizione> [ else <proposizione> ]
Altre produzioni con la notazione delle grammatiche CF:
A → bA | a
A → x | xy | xyy| xyyyy
A → xy | y
a → xu | xv |xy
sarebbero scritte in BNF così:
A::= {b}a
A::= x{y}4
A::= [x]y
A::= x (u,v,y)
*
<= 4
(Esaminare i cinque accorgimenti sul libro).
1. A
2. →
3.
4.
5.
<espressione_per_A>
::=
{. }
indica iterazione illimitata ( 0 o più volte)
n
{.}
indica iterazione per al più n volte
[ .]
indica la possibilità o meno
(. | . | .)
indica la scelta
Es. Identificatori del Pascal
<identificatore>::=<alfabetico> {<alfanumerico>}n-1
<alfanumerico>::=<alfabetico> | <cifra>
<cifra>::=0 | 1 | ..... | 9
<alfabetico>::=A | B | ..... | Z | a | ....... |z
Es. Frammenti del linguaggio Pascal
1. <programma_pascal> ::= <intestazione> ; <blocco>
2. <intestazione> ::= program <identificatore> [<lista par>]
3. <lista par> ::= <lista identif>
4. <lista identif> ::= <identificatore> {;<identificatore>}
5. <blocco> ::= [<sezione dichiarazione etichette>]
[<sezione definizione costanti>]
[<sezione definizione tipi>]
[<sezione dichiarazione variabili>]
[<sezione dichiarazione procedure e funzioni>]
[<sezione istruzioni>]
…......
<sezione definizione tipi>::= type <identificatore> =<tipo>
{;<identificatore> = <tipo>}
<proposizione-while> ::= while <predicato> do <proposizione>
<proposizione-if> ::= if <predicato> then <proposizione> else <proposizione>
….....
<predicato>::=<espressione-booleana>
<proposizione>::=<proposizione-semplice> | <proposizione-composta>
<proposizione-composta>::= begin <proposizione>{;<proposizione>} end
<proposizione-semplice>::= <assegnazione> |
<proposizione-while> |
<proposizione-if>
<assegnazione>::= <identificatore> := <espressione>
ε-PRODUZIONI
Con grammatiche di tipo 1, 2, 3 non è possibile generare la parola vuota ε.
Come possiamo generare ε, se necessario?
Basta aggiungere S → ε, ma solo se S non compare a destra di alcuna produzione.
Se invece S compare a destra di qualche produzione bisogna essere più accorti
perchè potrebbero venir generate parole nuove.
Ad es. le produzioni seguenti generano stringhe del tipo ab*bb.
S → Ub
U → ab|S
Se aggiungessimo S → ε genereremmo, oltre alla stringa vuota, anche quelle del
tipo bb*.
Vedremo che possiamo adottare una classifica delle grammatiche di Chomsky
così modificata:
– nelle grammatiche di tipo 1 la presenza di ε-produzioni è consentita solo
sull’assioma, a patto che non appaia a destra di una produzione.
– nelle grammatiche di tipo 2 e 3 è consentita la presenza di ε-produzioni su
qualunque metasimbolo.
Th. Se L(G) è di tipo 1, 2 o 3 è possibile modificare G in modo che:
• ci sia un'unica ε-produzione applicabile all'assioma S
• generi L ∪ {ε}
• le altre produzioni rimangano rispettivamente di tipo 1, 2 o 3.
Dim.
Se G è di tipo 1 o 2 basta aggiungere alle sue produzioni le produzioni S'→ε, S'→S
e considerare S' come nuovo assioma di G.
Se G è di tipo 3 basta aggiungere la produzione S'→ε, considerare S' come nuovo
assioma di G ed aggiungere per ogni produzione del tipo S→aB la produzione
S'→aB.
Es.
- Data la grammatica di tipo 2 G = <VT, VN, P, S>
S → aSb|ab
abbiamo G' = <VT, VN ∪ {S'}, P', S'>
S' → ε | S
S → aSb|ab
- Data la grammatica di tipo 3 G = <VT, VN, P, S>
S → aS|b
abbiamo G '= <VT, VN ∪{S'}, P', S'>
S' → ε |aS | b
S → aS|b
Cosa accade se le ε-produzioni sono ammesse non solo sull’assioma ma anche in
posizione più generale?
•
Nel caso di grammatiche di tipo 1 esse diventano strettamente più potenti,
equivalenti alle grammatiche di tipo 0.
Esempio. Sia G di tipo 0 con una sola produzione α → β con |α| > |β|, ad esempio
la produzione AB→C; usando un nuovo simbolo non terminale X si può sostituire
la produzione con AB→CX, X → ε ottenendo una grammatica G' di tipo 1 con una
ε-produzione su X, equivalente a G.
Teorema. Data una grammatica G di tipo 0 esiste una grammatica G’ equivalente a
G ottenuta estendendo una grammatica di tipo 1 con opportune ε-produzioni.
Dim. Da G=<VT, VN, P ,S> di tipo 0 ricaviamo una grammatica equivalente
G'=<VT,VN∪{X}, P', S> con X∉VN e P' uguale a P ma con in più, al posto di ogni
produzione α → β con |α| > |β|, la produzione α→βX....X, con X ripetuta |α|-|β|
volte, ed infine la produzione X → ε.
•
Al contrario delle grammatiche di tipo 1, per le grammatiche di tipo 2 e 3
l’aggiunta di ε-produzioni non modifica il potere generativo delle grammatiche,
cioè non si amplia la classe di linguaggi che possono essere generati con produzioni
di tipo 2 e 3, rispettivamente, e l'eventuale uso di ε-produzioni.
Il prossimo teorema dimostra infatti che data una grammatica di tipo 2 o 3 estesa
con ε-produzioni, ne possiamo costruire una equivalente, dello stesso tipo, che usa εproduzioni solo a partire dall’assioma (nel caso che ε appartenga al linguaggio) o
non ne usa affato (in caso contrario).
Esempi su cui riflettere.
1-
La grammatica regolare
S → bX | aB
B → cX
X→ ε
si può modificare in
S → b | aB
B→c
2-
La grammatica regolare
S → bA
A → aA | ε
si può modificare in
S → bA | b
A → aA | a
In entrambi i casi il linguaggio non contiene ε.
3-
Nella grammatica CF
S → AB | aB | B
A → ab | aB
B → cX | X
X→ε
abbiamo
S → AB | aB | B
A → ab | aB
B→c|ε
e successivamente
S → AB | A | aB | a | B | ε
A → ab | aB | a
B→c
In questo caso il linguaggio contiene ε.
Negli esempi illustratile ε-produzioni migrano verso l'assioma e possono verificarsi
due casi: o una ε-produzione sopravvive (ed allora il linguaggio generato contiene ε)
oppure ogni ε-produzione scompare (e quindi il linguaggio non contiene ε).
Teorema 2.3 (2.2). Se G è grammatica di tipo 3 (risp. 2) estesa con ε–produzioni,
esiste una grammatica G’ di tipo 3 (risp. 2) tale che L(G’) = L(G) –{ε}.
Dim.(completa sul libro a pag 70 (tipo3) e 67 (tipo 2)).
Dim. (tipo 3). Osserviamo subito che ε ∈ L(G) ⇔ S → ε è una produzione di G (una
qualunque altra produzione genererebbe un carattere terminale). Allora le produzioni
di G’ includono tutte le produzioni non vuote di G; poi, per ogni produzione vuota
A → ε (con A diverso da S) consideriamo tutte le produzioni di G del tipo B → aA
ed inseriamo nelle produzioni di G’ la produzione B → a.
Dim. (tipo 2).
- si determina l’insieme N di variabili dalle quali si può derivare ε.
- si nota che ε ∈ L(G) ⇔ S ∈ N
- per ogni produzione non vuota A→α di G, si inserisce la produzione in quelle di G'
e poi si procede così:
.. se nessun simbolo di α appartiene ad N non si fa altro;
.. se invece α contiene k simboli di N, nelle produzioni di G’ vanno inserite
tutte le produzioni A → β, con β ottenuto cancellando in α uno dei
sottoinsiemi dei k simboli (tranne quando k = |α | e si genererebbe A → ε).
Ad es. se esiste in P la produzione A → BCBA ed N ={S, A, B} allora vanno
inserite in P' le produzioni : A → BCBA| CBA | BCA | BCB |CA | CB | BC | C
Es. 2.2.2
G ha produzioni:
S → A | SSa
A → B | Ab | ε
B → S | ab | aA
G’ ha N = { A, S, B} e produzioni:
S → A | SSa | Sa| a
A → B | Ab | b
B → S | ab | aA |a.
Una grammatica equivalente a G è dunque una con in più le produzioni:
T → ε | S ed assioma T.
Le due dimostrazioni precedenti (per induzione sulla lunghezza delle derivazioni) si
basano sul fatto che per ogni A ∈ VN e ω ∈ V+
A ⇒G* ω ⇔ A ⇒G' ω
In conclusione possiamo adottare una classifica delle grammatiche di Chomsky
con la seguente modifica:
– nelle grammatiche di tipo 1 la presenza di ε-produzioni è consentita solo
sull’assioma, a patto che non appaia a destra di una produzione.
– nelle grammatiche di tipo 2 e 3 è consentita la presenza di ε-produzioni su
qualunque metasimbolo.
RICONOSCIMENTO DI LINGUAGGI
In generale il problema del riconoscimento di un linguaggio L su un alfabeto ∑ è il
problema decisionale di riconoscere se data una stringa x ∈ ∑* essa appartiene ad L
oppure no.
•
I linguaggi di tipo 3 sono riconosciuti in tempo lineare da dispositivi con
memoria costante (automi a stati finiti).
•
I linguaggi di tipo 2 (CF) sono riconosciuti in tempo lineare da dispositivi
nondeterministici dotati di una memoria gestita come una pila (automi a pila non
deterministici).
•
I linguaggi di tipo 1 (CS) sono riconosciuti da dispositivi nondeterministici con
memoria che cresce linearmente con la lunghezza della stringa da esaminare (automi
"linear bounded" non deterministici ).
•
Per alcuni linguaggi strettamente di tipo 0 è invece possibile che non esista un
algoritmo di riconoscimento ma esiste comunque una procedura che riconosce le
stringhe del linguaggio ma se una stringa non fa parte del linguaggio non è detto che
la procedura termini riconoscendo al non appartenenza. I dispositivi che consentono
di riconoscere o di attuare un procedimento di semiriconoscimento per i linguaggi di
tipo 0 sono le macchine di Turing.
Ricordiamoci che esistono infiniti linguaggi cui non corrisponde alcuna
grammatica!
Diciamo che un linguaggio è decidibile se ha un algoritmo che lo riconosce, cioè un
algoritmo che calcola la sua funzione caratteristica.
Diciamo che un linguaggio è semidecidibile se ha una procedura di
semiriconoscimento.
Proposizione. Un linguaggio di tipo 1 è decidibile.
Proposizione. Un linguaggio di tipo 0 è semidecidibile (vale anche l'inverso).
DECIDIBILITA’ DI PROBLEMI
Un problema decisionale definito su un insieme di istanze, alcune dotate di una
proprietà (istanze yes) altre no (istanze no), è detto decidibile se esiste un algoritmo
che per ogni istanza del problema sa decidere correttamente se è una istanza yes
oppure una istanza no. In caso contrario il problema è detto indecidibile. E’ detto
semidecidibile se esiste un algoritmo che sulle istanze yes del problema sa rispondere
correttamente.