Generazione e membership Le grammatiche generano il linguaggio definendolo iterativamente, come dato da tutte e sole le espressioni generabili tramite la grammatica. Si pone il problema duale della membership/parsing del linguaggio, cioè dell’algoritmo che risponde al problema se una data espressione w appartiene al linguaggio L: wL ? E, se si, della derivazione di w. E’ in fondo il problema opposto alla generazione: invece di costruire l’albero per ottenere dalle foglie l’espressione, data l’espressione vogliamo costruire l’albero da cui è stata generata (se esiste).
Più è complessa la grammatica, più è complesso il linguaggio generato, e più è complesso l’algoritmo della membership. Una grammatica semplice produce un linguaggio semplice e quindi poco espressivo, ma il problema della membership è risolto da un algoritmo semplice. Se voglio un linguaggio più espressivo e quindi più complicato, devo generarlo con una grammatica complessa, e complesso sarà anche il suo algoritmo di membership. Si definisce così una doppia gerarchia parallela di grammatiche e algoritmi di crescente complessità
Complessità di grammatiche e algoritmi La complessità di una grammatica si misura dal tipo di regole (molto o poco vincolato). La complessità di un algoritmo è misurata: - in primo luogo dal fatto se l’algoritmo termina o no per tutti i possibili dati di input (decidibilità). - in secondo luogo dalla relazione funzionale tra il tempo medio di esecuzione t e la dimensione n del dato di input (complessità computazionale), in genere scritta come t = O(f(n)), che va letto come limn t/f(n) = costante non nulla.
Complessità computazionale La gerarchia delle complessità computazionali coincide con la gerarchia degli infiniti asintotici. La gerarchia dei polinomi nk per k dato da un numero reale positivo coincide con la relazione di > tra i numeri reali. Al di sotto di tali polinomi nella gerarchia c’è log n, e poi log log n, etc. Così n log n è più complesso di n, ma meno di nk per ogni k>1. Al disopra di tali polinomi nella gerarchia c’è en , poi nn , etc. Da notare che n! = O(nn+1/2) La complessità computazionale degli algoritmi reali va in genere da n a n!
La decidibilità Un problema (ad esempio decidere se un numero è primo o se una certa formula è dimostrabile da certe premesse) si dice decidibile se esiste un algoritmo che per qualsiasi input in tempo finito ci dà la risposta (positiva o negativa). n P Se nei casi negativi l’algoritmo può non terminare il problema si dice semidecidibile n P Se può non terminare in entrami i casi è indecidibile P(n) Non P(n) P(n) Non P(n)
Gerarchia di Chomskij grammatica Tipo 3 –regolare. AaB / a Tipo 2 – context free. Aa Tipo 1 – context sensitive. ab |a| ≤ |b| Tipo 0 – ricorsivamente enumerabile. ab Algoritmo di membership Automa a stati finiti Chart o automa a pila Chart o macchina di Turing Macchina di Turing decidibilità decidibile semidecidibile Complessità computazionale lineare polinomiale, in certi casi lineare esponenziale --------------------- Ogni classe è un caso particolare della successiva. Al di là della classe 0 gli insiemi/linguaggi non sono generabili e non ammettono algoritmi di membership neanche semidecidibile. Sono insiemi di fatto intrattabili: se anche costruiamo un algoritmo di membership esso può andare in loop sia per risposte positive che negative (indecidibile). E vedremo che sono infiniti di una cardinalità transfinita superiore ai ricorsivamente enumerabili: esempi più importanti sono l’insieme delle verità aritmetiche o quello dei non teoremi della logica dei predicati.
grammatica regolare e automa a stati finiti: S aA / bS / b A aS / bA b a S a A b b L = {a bn a bm | n, m } grammatica context-free e chart: S aSb / ab L = {an bn | n } aaaaaabbbbb aaaaabbbbb aaaaaSbbbb aaaaSbbbb aaaaSbbb aaaSbbb aaaSbb aaSbb aaSb aSb aS S
Macchina di Turing S E’ un insieme di stati S={S, S’, S’’, ….}, un alfabeto di segni A={a, b, c, …}, e un insieme di quintuple {S, S’, a, b, spostamento}, ove spostamento può essere ‘destra’, ‘sinistra’ o ‘fermo’, che può essere interpretato come «se la S’ macchina sta nello stato S e legge il carattere a, transita nello stato S’, scrive b e si sposta a destra a sinistra o resta fermo». a Può essere rappresentata con un grafo labellato da terne i cui vertici b sono gli stati. S a, b, spost. S’ Ad esempio un algoritmo per la membership di L = {an bn | n } potrebbe essere dato dalla macchina di Turing a,a,s a,,d ,,f F ,,d F b,b,f a,a,s b,b,d a,a,d S ,,f ,,d b,,s ,,s b,b,d b,b,s
Membership e Generazione
Calcolo alla Gentzen A è un teorema sse si può derivare: A A1 A2 … Am B1 B2 … Bn clausola {A1, A2, …, Am} {B1, B2, …, Bn} sequente A1 A2 … Am B1 B2 … Bn Schema di Assiomi: G D ove G D REGOLE: G,A D G D,A G A, D A,G D G,A,B D G D,A G D,B G,A B D G D,AB G,A D G,B D G D,A,B G,A B D G D,A B G,A D ,B G D,A G,B D G D,A B G,A B D G,A D K L,A CUT G,K L,D A è un teorema sse si può derivare: A A1 C … Am B1 C … Bn tautologia (risoluzione) G,A D G A D (G A) D G A D G ( A D) G ( A D) G A, D
A B (AB)
ASSIOMATIZZAZIONE DELLA ARITMETICA PAII: categorica induzione II ordine incompleta ( P) [P(0) ( x) (P(x)=>P(s(x))) => ( x) P(x)] completa moltiplicazione Pressburger arithmetic addizione e addizione Teoria del successore induzione I [P(0) ( x) (P(x)=>P(s(x))) => ( x) P(x)] I primi tre assiomi di Peano (x) ( y) s(x)=s(y) => x=y ( x) ¬(x=0) => ( y) s(y)=x ¬( y) s(y)=0
ASSIOMI DI ZERMELO-FRAENKEL
|P()| Not(GCH,CA), CH Not(GCH,CA, CH) 0 1 2 3 0 1 2 3 0 1 2 3 || |P()|=|| |P()| 0 1 2 3 || |P()|=|| |P()| |P(P())| Not(GCH), CA, CH || |P()|=|| Not(GCH, CH), CA 0 1 2 3 |P()| Not(GCH,CA), CH || |P()|=|| 0 1 2 3 || Not(GCH,CA, CH) || 0 1 2 3