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.
© Copyright 2024 Paperzz