Intorno al Lemma d`Iterazione per Linguaggi Liberi dal Contesto
Transcript
Intorno al Lemma d`Iterazione per Linguaggi Liberi dal Contesto
Intorno al Lemma d’Iterazione per Linguaggi Liberi dal Contesto Gabriele Gullà Introduzione Nelle pagine che seguono tratterò, in forma sintetica e il più possibile autocontenuta, le principali proprietà dei linguaggi liberi dal contesto o non contestuali (cfr. [4] e [5] tra i primi lavori in proposito), con particolare attenzione al Lemma d’Iterazione. Per citare tale risultato userò l’acronimo PL (dall’inglese Pumping Lemma). Quello che in letteratura anglosassone è chiamato Iteration Lemma sarà da me riportato (per evitare qualsiasi confusione) come Lemma di Ogden (in modo del tutto legittimo, cfr [3] e [7]). Mi riferirò ai suddetti linguaggi e alle grammatiche che li generano usando rispettivamente gli acronimi anglofoni CFL (context-free language/s) e CFG (context-free grammar/s). Verranno omesse tutte le definizioni di carattere generale che non siano strettamente legate alla proprietà di libertà dal contesto (ovvero le definizioni di grammatica, derivazione, linguaggio, parola, produzione etc). Per esse si rimanda a [6], [7], e [8]. Nella prima sezione saranno fornite le definizioni di CFG e CFL, nella seconda verrà data una utile rappresentazione della relazione di derivazione nelle CFG, mentre nella terza sezione mostreremo come ogni CFG sia equivalente ad una grammatica di forma particolare. Nella quarta sezione, con le definizioni e i risultati delle tre precedenti, verrà dimostrato il PL. Infine, nell’ultima sezione, sarà usato il PL per mostrare alcune proprietà di chiusura dell’insieme dei CFL, e per discutere di alcuni problemi di decidibilità legati a tali linguaggi. La simbologia usata è sostanzialmente quella di [8], quindi: 1 1) le prime lettere latine maiuscole (e S) per le variabili; 2) le lettere latine minuscole per i simboli terminali; 3) le ultime lettere latine maiuscole per simboli terminali o non; 4) le ultime lettere latine minuscole per stringhe di terminali; 5) le lettere greche minuscole per stringhe di terminali e non. Mi discosterò dalla letteratura classica per quel che riguarda il simbolo di derivazione: per tale relazione e per la sua chiusura transitiva e riflessiva ∗ ho deciso infatti di usare i simboli “*” e “*”. Questo per non creare confusione (quantomeno estetica) con i simboli “⇒”, usato nelle implicazioni logiche, e “`”, usato nella sua variante “a” per designare il completamento della dimostrazione di una proposizione. 2 1 Linguaggi e Grammatiche Liberi dal Contesto In questa sezione fornirò le definizioni di base necessarie all’intera trattazione, più alcuni esempi utili ad una maggiore comprensione. Definizione 1.1 Sia G una grammatica; indichiamo con: 1) V l’insieme dei suoi simboli non terminali (o variabili ); 2) T l’insieme dei simboli terminali ; 3) P l’insieme (finito) delle produzioni ; 4) S ∈ V l’assioma della grammatica; 5) Σ = V ∪ T ; Allora G è una CFG se e solo se vale p∈P ⇔p=A→α dove A ∈ V e α ∈ Σ∗ . Come è noto dalla Gerarchia di Chomsky, CFG⊃ {Grammatiche Regolari}. 6= Osservazione 1.1 La locuzione “non contestuale” deriva dal fatto che il primo termine delle produzioni di una CFG non è mai giustapposto a un qualche β ∈ Σ∗ . A tal proposito si consideri il seguente Esempio 1.1: sia L = {an bn cn |n ≥ 1}; tale linguaggio può essere generato dalla grammatica in cui 1) T = {a, b, c} 2) V = {S, B} 3) P = {S → aBSc, S → abc, Ba → aB, Bb → bb} allora, nell’ultima produzione, B può essere rimpiazzato da b solo se alla sua destra compare il “contesto” b. Dunque L è un linguaggio contestuale. Vedremo in seguito che L è strettamente contestuale, ovvero CFG⊂ {Grammatiche Contestuali}. 6= Naturalmente L è un CFL se e solo se è generato da una CFG, ovvero i ∗ suoi elementi sono parole di T ∗ derivate (*) da S in una CFG. ∗ Un elemento β ∈ Σ∗ è detto forma sentenziale se S * β. 3 Esempio 1.2 Sia G una grammatica tale che: 1) V = {S}; 2) T = {a, b}; 3) P = {(I)S → aSb, (II)S → ab} Poichè il termine sinistro di ogni produzione contiene solo una variabile, essa è una CFG. Il linguaggio che essa genera contiene certamente la parola an bn ∀ n ≥ 1, in quanto applicando n − 1 volte la (I) produzione e poi la seconda si ottiene S → aSb → · · · · · → an−1 Sbn−1 → an bn Inoltre non contiene parole di altra forma, infatti solo la produzione (II) può essere usata isolatamente (e produce ab), mentre la (I) può essere usata un numero arbitrario di volte (generando stringhe al cui interno è sempre presente il simbolo S), ma tale derivazione deve essere sempre completata da un (unico) uso della (II). Dunque il CFL generato è L = {an bn |n ≥ 1}. a 4 2 Alberi di Derivazione In questa sezione verrà fornita una diversa rappresentazione della relazione di derivazione. Definizione 2.1 Un albero (finito) è un grafo minimalmente connesso, ovvero tale che, se si elimina un arco tra due nodi, si ottengono due grafi indipendenti. Designando un nodo come iniziale si ottiene un albero radicato. In questo caso gli archi assumono un’orientazione ideale uscente dal nodo-radice. I nodi di una albero radicato possono essere ordinati (dunque enumerati) a partire dalla radice verso il basso e da sinistra verso destra. Dato un nodo n, i nodi ad esso direttamente connessi e contraddistinti da un ordinale maggiore, sono detti figli del nodo. Ogni nodo di un albero è caratterizzato da un altro numero naturale, il grado del nodo, che indica il numero di archi uscenti piú quelli entranti (dal e nel nodo). Allora diciamo che un nodo è interno se il suo grado è ≥ 2, mentre se il grado è 1 il nodo è detto foglia (o nodo esterno o terminale). In un albero un cammino è una concatenazione di archi e la sua lunghezza è il numero di questi ultimi. Definizione 2.2 Data una CFG, un albero radicato è di derivazione se: 1) ad ogni nodo è assegnato un simbolo (etichetta) in Σ ∪ {}; 2) l’etichetta della radice è l’assioma S della CFG; 3) i nodi interni sono etichettati da elementi di V ; 4) se il nodo n è etichettato da A e i nodi figli di n sono n1 , n2 , ...., nk con etichette X1 , X2 , ....., Xk , allora A → X1 X2 .....Xk è una produzione della grammatica. 5) se un nodo n ha come etichetta il simbolo vuoto , allora tale nodo è una foglia ed è l’unico figlio di n. Sia T un albero radicato; allora T 0 è un sottoalbero di T se T 0 è un albero radicato, T 0 ⊂ T ma la sua radice può non essere S. Infine chiamiamo raccolto di un albero T la parola ottenuta leggendo le etichette delle foglie di T secondo l’ordine sopra stabilito: hanno precedenza le foglie più alte, e tra due foglie di uguale altezza ha la precedenza quella 5 più a sinistra. Tutto ciò al fine del seguente Teorema 2.1 Data una CFG, β è una forma sentenziale se e solo se esiste un albero di derivazione con raccolto β. a Ometto la dimostrazione (reperibile in [8], cap. 4 sez. 3) perchè esula dai miei scopi. Ho però riportato il teorema per sottolineare il rapporto strettissimo tra derivazioni e alberi di derivazione che ci consentirà di dimostrare il PL. Remark 2.1 Per come è definito, un albero di derivazione non determina univocamente l’ordine con cui le produzioni devono essere applicate. 6 3 CFG in Forma Normale In questa sezione esporrò un particolare procedimento di trasformazione di una qualsiasi CFG in un’altra equivalente alla prima dal punto di vista del potere generativo, ma le cui produzioni assumono solo due precise forme. In queste pagine non fornirò dimostrazioni (se non qualche cenno) per non appesantire troppo la trattazione. Per i particolari si rimanda a [7] e [8]. Definizione 3.1 Diciamo che un simbolo X ∈ Σ è utile se esiste una derivazione ∗ ∗ S * αXβ * u, con α, β ∈ Σ∗ e u ∈ T ∗ . Simboli per i quali non esistono tali derivazioni sono inutili. Una produzione del tipo A → è detta -produzione. Le produzioni del tipo A → B, B ∈ V sono dette produzioni unitarie. Allora: Lemma 3.1 Ogni CFL non vuoto e senza è generato da una CFG senza simboli inutili, -produzioni o produzioni unitarie. Dimostrazione (cenni) Quest lemma è il “collage” di diversi risultati, quindi darò solo un’idea di come eliminare i simboli inutili. Per le -produzioni e produzioni unitarie rimandiamo (per motivi di spazio e di pertinenza) a qualsiasi testo sulle CFG. Sia G = (V, T, P, S) una CFG; allora esiste una procedura effettiva (basata su un algoritmo iterativo e completata da un’induzione) che permette di costruire una CFG G 0 = (V 0 , T, P 0 , S) tale che per ogni A ∈ V 0 esiste un qualche ∗ u ∈ T ∗ tale che A * u. Ora, da G 0 possiamo ottenere (sempre in modo effettivo) una CFG G 00 = (V 00 , T̃ , P 00 , S) tale che per ogni X ∈ (Σ00 ) esistono α, β ∈ (Σ00 )∗ tali che ∗ S * αXβ. a Dal lemma precedente si ricava il seguente Teorema 3.1 Ogni CGL senza è generato da una CFG le cui produzioni sono tutte della forma 7 (I) A → BC oppure (II) A → a con B, C ∈ V e a ∈ T . Questa particolare forma per le CFG è detta Forma Normale di Chomsky (CNF). a Remark 3.1 Per ottenere la CFG senza simboli inutili, gli algoritmi G 7−→ G 0 e G 0 7−→ G 00 presenti nella dimostrazione del lemma 3.1 vanno eseguiti esattamente in quell’ordine. Vediamo il perchè con il seguente Esempio 3.1 Consideriamo la CFG con produzioni 1) S → AB 2) S → a 3) A → a ed eliminiamo i simboli inutili: passo (I)- poichè da B non è derivabile alcun simbolo terminale, possiamo eliminarlo insieme alle produzioni che lo coinvolgono. Dunque ci riduciamo a 1’) S → a 2’) A → a ∗ passo (II)- ora l’unica produzione tale che esiste una derivazione S * γ è la (1’), quindi possiamo eliminare la (2’) e con lei il simbolo inutile A ottenendo una CFG equivalente a quella data. Se avessimo applicato prima il passo (II) avremmo concluso che solo B era inutile, in quanto A compare nella produzione della forma sentenziale a (S → AB → a). Applicando ora il passo (I) avremmo dovuto lasciare la produzione A → a e con essa il simbolo inutile A. a Ora voglio fornire un semplice esempio su come trasformare una CFG in un’altra in CNF: 8 Esempio 3.2 Si consideri la CFG definita dalle produzioni 1) S → bA 2) S → aB 3) A → bAA 4) A → aS 5) A → a 6) B → aBB 7) B → bS 8) B → b Le produzioni (5) e (8) non le tocchiamo (sono già della forma cercata). Nelle altre produzioni rimpiazziamo, a destra, i terminali con variabili: 1) S → bA diventa S → CA e C → b 2) S → aB diventa S → DB e D → a 3) A → bAA diventa A → CAA 4) A → aS diventa A → DS 6) B → aBB diventa B → DBB 7) B → bS diventa B → CS ora trasformiamo le produzioni che a destra hanno più di due variabili: A → CAA diventa A → CE e E → AA B → DBB diventa B → DH e H → BB Dunque la nuova CFG (ripetiamo: equivalente a quella data) è definita dalle nuove produzioni: 1)S → CA 2)C → b 3)S → DB 4)D → a 5)A → DS 6)B → CS 7)A → CE 8)E → AA 9)B → DH 10)H → BB 11)A → a 12)B → b a 9 Remark 3.2 La CNF non è l’unica forma normale per CFG. Un’altra, estremamente importante ma inutile ai fini di questa trattazione, è la Forma Normale di Greibach per la quale esiste un teorema analogo al 3.1. L’interesse per questa forma sta, per il sottoscritto, in alcune sue applicazioni che forniscono delle rappresentazioni algebrico-insiemistiche per CFG: si vedano in [1] i teoremi di Shamir, Chomsky-Schützenberger, Greibach e Wechler. 10 4 Il Pumping Lemma per CFL In questa sezione mi occuperò del Pumping Lemma, la cui prima dimostrazione apparve in [2]. Tale risultato è un corollario pressochè diretto del Lemma di Ogden (per quest’ultimo cfr [7] e [8]) dimostrato nel 1968; qua però il PL sarà dimostrato direttamente, senza passare attraverso la sua generalizzazione. Partiamo da un lemma che aiuterà nella dimostrazione del PL. Lemma 4.1 Si consideri una CFG in CNF e l’albero di derivazione ad essa associato, sia u il raccolto di tale albero e sia n la lunghezza del cammino più lungo presente nell’albero. Allora |u| ≤ 2n−1 . Dimostrazione Per induzione su n: 1) se n = 1 allora l’albero è composto da 2 nodi, la radice S e il terminale u, connessi da un arco. Dunque |u| = 1 = 21−1 e la base dell’induzione è provata. 2) Se n > 1 allora l’albero comincia con una produzione del tipo A → BC e non con una che produce un simbolo terminale. Consideriamo i sottoalberi radicati in B e C: in essi il cammino più lungo sarà certamente più corto di n, dunque per ipotesi induttiva i loro raccolti hanno lunghezza non superiore a 2n−2 . Il raccolto dell’intero albero è la concatenazione di questi ultimi due raccolti, dunque la sua lunghezza è non superiore a 2n−2 + 2n−2 = 2n−1 . a Pumping Lemma per CFL (Bar Hillel-Perles-Shamir, 1961) Sia L un CGL. Allora esiste una costante NL tale che se z ∈ L e |z| ≥ NL , allora si ha che z = uvwxy in modo che 1) |uwx| ≤ NL 2) |vx| ≥ 1 3) ∀ i ≥ 0 uv i wxi y ∈ L Dimostrazione Sia L un CFL; possiamo supporre {} = 6 L= 6 ∅ altrimenti la tesi del teorema è banalmente verificata. Sia dunque ora G una CFG in CNF che genera L \ {}, e sia m il numero di 11 variabili di G. Scegliamo NL = 2m . Sappiamo dal lemma 4.1 che un albero il cui cammino più lungo misura m deve avere un raccolto non superiore a 2m−1 = N2L . Ora, z è troppo lungo per essere il raccolto di un siffatto albero, quindi l’albero relativo al raccolto z (sia esso T ) deve avere il cammino più lungo di misura almeno m + 1. Un tale cammino conterrà almeno m+1 variabili A0 , A1 , ....., Am , tra le quali, quindi, ve ne saranno almeno due uguali, diciamo Ai = Aj con i < j. Allora il sottoalbero Tj radicato in Aj sarà strettamente contenuto nel sottoalbero Ti radicato in Ai (perchè quest’ultimo precede Aj ) e possiamo prendere come w il raccolto di Tj , come v e x le stringhe rispettivamente alla sinistra e alla destra di w nell’albero Ti e come u e y le stringhe rispettivamente a sinistra di v e a destra di x in T . Notiamo che, poichè in una CFG in CNF non ci sono produzioni unitarie, v e x non possono essere entrambe quindi |vx| ≥ 1. Abbiamo dunque mostrato (2) e (3), ma quest’ultima solo per i = 1. Per i = 0 basta eliminare Ti e radicare in Ai l’albero Tj : lo possiamo fare perchè la due radici sono etichettate dallo stesso simbolo. Dunque in questo caso v e x spariscono e otteniamo che uv 0 wx0 y ∈ L. Per i > 1 basta eliminare Tj e radicare in Aj l’albero Ti (cosa lecita per il motivo già indicato): in questo modo otteniamo uv 2 wx2 y; iterando questo rimpiazzamento di alberi si ottengono tutte le altre uv i wxi y. Resta da provare (1): è ovvio che, poichè Ti ⊆ T , il suo cammino più lungo non supera m + 1, dunque, ancora per il lemma 4.1, il suo raccolto, che è vwx, avrà lunghezza non superiore a 2m = NL , a Come per il caso regolare, anche in ambito non contestuale il PL può essere usato per stabilire se un linguaggio non è un CFL. Di seguito un esempio scarsamente (se non per nulla) reperibile nella letteratura classica: Esempio 4.1 n Proviamo che L = a2 |n ≥ 1 non è un CFL. Supponiamo per assurdo che lo sia, e siano N la costante del PL. Notiamo subito che tutte le parole di L hanno come lunghezza una potenza di N 2. Sia quindi z = a2 = uvwxy una parola tale che certamente |z| = 2N > N e con |vx| ≥ 1 e |vwx| ≤ N . 12 Allora |vx| = 2a B, 0 ≤ a ≤ (N − 1) ∧ B ∈ {2m + 1|∀ m ∈ N} cioè, o è una potenza di 2, o è un altro numero pari o è dispari. Ma allora, in ogni caso |uwy| = 2N − 2a B = 2a (2N −a − B) 6= 2k ∀ k∈N Dunque uwy ∈ / L: assurdo. a L’esempio classico, che invece riportano tutti i testi, sull’uso del PL (cfr ad es. [8]) è L = {an bn cn |n ≥ 1} già visto nella prima sezione. Se v e x contengono almeno due simboli diversi allora uv 2 wx2 y contiene simboli mescolati, dunque non sta in L: assurdo. Se invece v e x contengono un solo simbolo, allora uv 2 wx2 y non contiene lo stesso numero di a, b e c, e di nuovo non sta in L. Di nuovo assurdo. a Useremo tale linguaggio nella prossima sezione. 13 5 Alcune Proprietà di Chiusura e di Decidibilità In questa sezione presento altre proprietà dei CFL legate al PL. Per la natura stessa del PL vi sono casi in cui questo risultato non è d’aiuto, ovvero quando un linguaggio rispetta la tesi del PL pur non essendo un CFL. Allora si può mostrare che un dato linguaggio non è CFL o usando il Lemma di Ogden, o generando a partire dal linguaggio un altro linguaggio non CFL usando solo operazioni che preservano i CFL. Teorema 5.1 L’insieme dei CFL è chiuso sotto le operazioni di: 1) Unione 2) Concatenazione S i 3) Chiusura di Kleene (L∗ = ∞ i=0 L ) 4) Sostituzione Dimostrazione (cenni) Siano L1 e L2 due CFL generati da G1 = (V1 , T1 , P1 , S1 ) e G2 = (V2 , T2 , P2 , S2 ). Allora (1) la grammatica G3 = (V1 ∪ V2 ∪ {S3 } , T1 ∪ T2 , P1 ∪ P2 ∪ {S3 → S1 |S2 } , S3 ) genera L3 = L1 ∪ L2 . (2) La grammatica G4 = (V1 ∪ V2 ∪ {S4 } , T1 ∪ T2 , P1 ∪ P2 ∪ {S4 → S1 S2 } , S4 ) genera L4 = L1 L2 . (3) La grammatica G5 = (V1 ∪ {S5 } , T1 , P1 ∪ {S5 → S1 S5 |} , S5 ) genera L5 = L∗1 . Prima di completare la dimostrazione diamo la seguente Definizione 5.1 Siano A e B due alfabeti. Una sostituzione è una mappa f : A −→ P(B ∗ ) che associa ad ogni simbolo di A un linguaggio in B ∗ . Tale mappa si estende 14 alle parole ponendo: ∗) f () = ; ∗) f (ua) = f (u)f (a) S La mappa si estende poi ad interi linguaggi ponendo f (L) = x∈L f (x). Allora (4): siano G e Ga le CFG che generano i CFL L e La , con a ∈ Σ. Il linguaggio f (L) è generato dalla grammatica G̃ cosı̀ fatta: • • • • Ṽ T̃ S̃ P̃ = V ∪ {Ga }a∈Σ = {Ta }a∈Σ =S = {Pa }a∈Σ ∪ {P 0 } dove P 0 contiene le produzioni di G della forma A → α, in cui ad ogni istanza di a ∈ α viene sostituito l’assioma Sa . Poichè un omomorfismo è una particolare sostituzione in cui f (a) contiene una sola parola, segue che i CFL sono chiusi anche per omomorfismi. In realtà lo sono anche per omomorfismi inversi, ma la dimostrazione di questo risultato fa uso degli automi a pila, la controparte non contestuale degli automi a stati finiti, che però io non tratterò. a Teorema 5.2 L’insieme dei CFL non è chiuso rispetto alle operazioni di intersezione e complementazione. Dimostrazione Siano L1 = ai bi ck |i ≥ 1, k ≥ 1 e L2 = ai bk ck |i ≥ 1, k ≥ 1 ; essi sono generati rispettivamente dalle grammatiche di produzioni: (1) S → AB, (2) S → CD, A → aAB|ab, B → cB|c C → ac|a, D → bDc|bc quindi L1 e L1 sono CFL, ma L1 ∩ L2 = {ai bi ci |i ≥ 1}, che sappiamo non essere un CFL (cfr sez. precedente). 15 Se poi fossero chiusi per complementazione lo sarebbero anche per intersezione perchè, dalle leggi di De Morgan, L1 ∩ L2 = (Lc1 ∪ Lc2 )c a Termino ora questo breve survey con un classico risultato di decidibilità per CFL, derivante dal PL. Teorema 5.2 Dato un CFL è decidibile stabilire se esso sia (1) vuoto o (2) infinito, e quindi anche se esso sia (3) finito e se (4) una data parola, essa vi appartenga o no. Dimostrazione Sia G = (V, T, P, S) una CFG in CNF, e sia L il CFL da essa generato; sia poi N = |V |. Per il PL se z = uvwxy ∈ L con |z| > 2N allora uwy ∈ L e |uwy| ≤ 2N . Quindi se L = 6 ∅ vi si può trovare una qualche stringa di lunghezza al più 2N . Ora, in una CFG in CNF le produzioni o trasformano una variabile nella concatenazione di due variabili, o sostituiscono un terminale a una variabile, quindi una stringa di lunghezza k è generata da una derivazione di lunghezza non superiore a 2k − 1. Questo perchè, nella peggiore delle ipotesi, ci si trova di fronte una situazione del tipo S → A1 A2 → A11 A12 A2 → A11 A12 A21 A22 → .... → a1 a2 ....ak quindi, salvo per la prima coppia di variabili generate dall’assioma della CFG, ad ogni variabile segue una produzione che ne genera altre due fino a che per ogni variabile non si genera un unico terminale: 2k − 1 produzioni. Dunque per verificare che in L vi sia una stringa di lunghezza al più 2N basta analizzare le derivazioni di lunghezza al più 2N +1 − 1 che sono non più di |P | · 2N +1 . Abbiamo quindi mostrato (1) e (4). Se poi 2N < z ≤ 22N , sempre per il PL, il linguaggio è infinito (perchè contiene infinite stringhe uv i wxi y), quindi, come in precedenza, basta considerare le derivazioni di lunghezza non superiore a 22(N +1) − 1, il cui numero è superiormente limitato dal valore |P | · (22N +1 ), e verificare che qualcuna di esse produca una stringa di terminali. Questo mostra (2) e (3) (perchè se L= 6 ∅ e non è infinito allora è finito). a 16 References [1] Autebert,J-M. - Berstel,J - Boasson,L. :“Context-Free Languages and Pushdown Automata”, cap. 3, vol. 1 del “Handbook of Formal Languages”, Rozemberg-Salomaa Ed. per Springer, 1997; [2] Bar Hillel,Y - Perles,M - Shamir,E :“On Formal Properties of Simple Phrase Structure Grammars”, Zeitschrift für Phonetik, Sprachwissenschaft und Kommunikationsforschung, 1961; [3] Berstel,J - Boasson,L. :“Context-Free Languages, cap. 2 del “Handbook of Theoretical Computer Science”, J. van Leeuwen Ed., 1990; [4] Chomsky,N. :“On Certain Formal Properties of Grammars”, Information and Control 2, 1959; [5] Chomsky,N. - Schützenberger,M.P. :“The Algebraic Theory of ContextFree Languages”, in “Computer Programming and Formal Languages”, Braffort-Hirschberg Ed. per North Holland, 1963; [6] De Luca,A - D’Alessandro,F. :“Teoria degli Automi Finiti”, Springer Ed., 2013; [7] Harrison,M :“Introduction to Formal Language Theory”, Addison-Wesley Ed., 1978; [8] Hopcroft,J.E. - Ullman,J.D. :“Introduction To Automata Theory”, Addison-Wesley Ed., 1979; 17