COMPRENSIONE DEL LINGUAGGIO NATURALE

Il modo piu' naturale per l'uomo per comunicare con i suoi simili e' quello di parlare o scrivere in linguaggio naturale, sia esso italiano, inglese, o cinese.

Al fine di comunicare occorre pero' essere in grado di comprendere enunciati in linguaggio naturale.

Comprendere un enunciato in linguaggio naturale significa avere in precedenza definito una rappresentazione del significato delle parole, e quali sono i processi di riconoscimento e costruzione del significato stesso.

Il significato di una parola e, piu' in generale di una frase, non e' pero' solo un attributo descrittivo legato alla parola o alla frase, ma e' una nozione operativa piu' complessa ed integrata in un modello che simula il processo di comprensione umana.

Ma cosa si intende per comprensione ?

Da un punto di vista computazionale si puo' affermare che un ipotetico utente ha la prova che un ipotetico "robot" ha  compreso i suoi comandi in linguaggio naturale, se la risposta del robot e' conforme alle aspettative dell'utente.

Si tratta di una esemplificazione facilmente trasferibile anche nella interazione umana; in effetti non abbiamo nessuna indicazione del fatto che il nostro interlocutore "capisca quello che gli si dice" e del come questa comprensione avvenga, fintanto che egli non ce ne dara' un segno.

Al fine di illustrare le tecniche di comprensione del linguaggio naturale (nel seguito parlando di linguaggio naturale considereremo il linguaggio naturale scritto e non quello parlato) possiamo schematizzare il processo di comprensione in due passi:
* comprensione di ogni singola parola di una frase .
* collegamento reciproco di tutte le parole al fine di creare delle strutture che rappresentino il significato dell'intera frase .

Il primo dei due passi sembra, a prima vista, piu' banale: basta ricercare ogni parola in un dizionario (chiamato spesso anche lessico) e leggere  in corrispondenza di ogni parola il corrispondente significato.

Purtroppo molte parole hanno piu' di un significato, e spesso non e' possibile scegliere quello corretto considerando la parola isolatamente, ma occorre andare ad analizzare l'intero contesto della frase o, addirittura, del periodo.

Per poter eseguire il secondo passo occorre poi tenere conto di vari tipi di informazioni quali, ad esempio, la conoscenza del particolare linguaggio utilizzato, le convenzioni di comunicazione tra chi parla (o scrive) e chi ascolta (o legge), la conoscenza generale sul mondo che ci circonda.

Questo secondo passo, data la sua complessita', viene normalmente suddiviso in:

1)analisi sintattica, dove la sequenza di parole della frase da analizzare viene trasformata in strutture che mostrano come le parole sono in relazione le une con le altre;
2)analisi semantica, dove viene assegnato, se possibile, un certo significato alle strutture individuate al passo precedente.

Durante questa fase vengono scartate strutture per le quali non sia possibile effettuare tale assegnazione.

Per esempio, la frase "le verdi idee senza colore dormono furiosamente" [Chomsky 1969], corretta dal punto di vista sintattico, dovrebbe essere viceversa scartata dall'analizzatore semantico;

3)analisi pragmatica, in cui le strutture che rappresentano la frase in corso di analisi, vengono reinterpretate per determinare il significato corrente.

Spesso il confine tra queste fasi non e' cosi' marcato e puo' essere necessaria una certa interazione tra un tipo di analisi e l'altro.

Un approccio semplice alla comprensione di frasi in linguaggio naturale storicamente e' stato quello di riunire le operazioni sopra descritte in un unico passo.

Questo puo' essere fatto ricercando nella frase da analizzare opportune parole chiave ( templates ).

Ricercando solo alcune parole nella frase da analizzare, cioe' quelle che combaciano con i templates, si ha il vantaggio di analizzare anche frasi parzialmente sgrammaticate; vengono pero' ignorate un gran numero di informazioni contenute nella frase stessa.

Tale approccio venne seguito nei primi sistemi in grado di ricevere comandi in linguaggio naturale come ELIZA [Weizenbaum 1966], che simula il colloquio con uno psichiatra, e STUDENT [Bobrow 1968], che risolve problemi esprimibili con equazioni di primo grado.

Per evitare che nessun dettaglio del significato di una frase vada perduto, l'approccio successivamente seguito fu quello di analizzare in dettaglio prima di tutto la struttura della frase ( parsing ).
 

TIPI DI GRAMMATICHE

Principali obiettivi del processo di parsing sono:

a)determinare quali frasi sono grammaticalmente corrette e quali no;
b)assegnare una struttura alle frasi grammaticalmente corrette.

Per raggiungere tali obiettivi, gli algoritmi di parsing utilizzano delle grammatiche.
Riprendiamo qui di seguito alcuni concetti visti in precedenza, e li estendiamo.

Una grammatica a struttura di frase e' una quadrupla G=(V,VT,R,S) dove:
* V e' un insieme finito non vuoto chiamato vocabolario del sistema;
* VT e' un sottoinsieme non vuoto di V chiamato vocabolario dei simboli terminali;
il vocabolario dei simboli non terminali VNT e' allora dato da V-VT.
* R e' un insieme finito di regole della forma:
A--->B dove A appartiene < V*VNT V* > e B appartiene V*.
(* viene chiamato anche operatore di Kleene, e sta ad indicare che del simbolo in oggetto possono essere presenti qualunque numero di occorrenze, compresa la stringa vuota);
* S e' un elemento che appartiene a VNT e viene chiamato simbolo distintivo.

Per ogni grammatica esiste un linguaggio L(G) che e' costituito dall'insieme di tutti i simboli terminali che possono essere derivati dal simbolo distintivo applicando un numero finito di regole R.

Nei linguaggi naturali esiste il problema della ambiguita'; una frase puo' avere piu' significati, come ad esempio:

                                          "la vecchia porta la sbarra"

in cui il terminale "porta" puo' essere considerato come derivazione di un sintagma nominale, oppure come derivazione di un sintagma verbale.

Dato un linguaggio, possono esistere diverse grammatiche che permettono di descriverlo; tali grammatiche non risultano pero' essere equivalenti in utilita'.

Alcune di esse possono essere utilizzate per analizzare efficacementeil linguaggio, mentre altre possono richiedere delle ricerche piu' laboriose; inoltre, grammatiche differenti producono differenti alberi sintattici.

Secondo le definizioni date fino a questo punto, non compare nessuna forma di restrizione sulle regole di una grammatica.

Sia nella parte sinistra che nella parte destra di una regola possono essere presenti qualunque numero, purche' finito, di simboli; Inoltre le regole possono essere ricorsive.

Analizzare frasi mediante una grammatica cosi' definita, puo' risultare molto pesante e  complesso dal punto di vista computazionale.

Introducendo invece alcune restrizioni sulla forma delle regole, e' possibile effettuare del parsing in modo efficiente.

L'introduzione di tali restrizioni impone pero' delle limitazioni sui linguaggi descrivibili con queste grammatiche.

Seguendo gli studi di N.Chomsky [1969], e' possibile suddividere le grammatiche a struttura di frase in quattro tipi, a seconda della forma delle produzioni: Tipo 0 ,Tipo 1, Tipo 2,Tipo 3.

Nelle grammatiche di tipo 0 non ci sono restrizioni sulla forma delle regole.

Come gia' accennato, questo tipo di grammatiche e' troppo generale per essere usato e, in generale, molto difficile. Il linguaggio generato da una grammatica di tipo 0 e' detto linguaggio di tipo 0.

Le regole di una grammatica di tipo 1 o grammatica contestuale hanno la forma:
aAb--->aBb dove A appartiene VNT, a,b,B appartiene V con B\=$ (stringa vuota).
Tali regole possono essere lette come: "A genera B all'interno del contesto a,b".

Il linguaggio generato da una grammatica di tipo 1 o contestuale e' chiamato linguaggio di tipo 1 o linguaggio contestuale.

Le regole di una grammatica di tipo 2 o grammatica libera da contesto hanno la forma:

A--->B  dove A  VNT, B  V*-$.

Il linguaggio generato da una grammatica di tipo 2 o libera da contesto e' chiamato linguaggio di tipo 2 o linguaggio libero da contesto.

Le regole di una grammatica di tipo 3 o grammatica regolare hanno la forma:

A-->aB oppure A--->a dove A,B  VNT, a  VT

oppure la forma:

A--->Ba oppure A--->a.

Il linguaggio generato da una grammatica di tipo 3 o regolare e' chiamato linguaggio di tipo 3 o linguaggio regolare.

I linguaggi regolari possono essere analizzati utilizzando automi a stati finiti.

Un automa a stati finiti e' una struttura nella quale l'analisi viene modellata come una transizione da uno stato, appartenente ad un insieme finito di stati, ad un altro stato.

Uno stato particolare e' segnato come "stato di partenza", ed esistono uno o piu' stati segnati come "stati finali".

In un modello di questo tipo, una frase e' detta grammaticalmente corretta se, analizzandola parola dopo parola da sinistra verso destra, e' possibile effettuare delle transizioni fino a raggiungere uno stato finale.

Gli stati dell'automa sono connessi mediante archi etichettati, dove l'etichetta indica il simbolo che deve essere in quel momento presente nella stringa in ingresso per poter effettuare quella transizione.

Anche se gli automi a stati finiti sono efficienti, il loro utilizzo nell'analisi del linguaggio naturale e' limitato per le restrizioni imposte sulle regole della grammatica che, per esempio, non permettono di rappresentare piu' frasi relative in cascata.

Discorso analogo vale anche per i linguaggi di programmazione in cui e' indispensabile rappresentare espressioni a vari livelli, utilizzando le parentesi.

Grammatiche regolari vengono comunque utilizzate per l'analisi lessicale, in cui e' semplicemente richiesto di individuare sequenze di caratteri che rappresentino delle parole.
 
Per i linguaggi liberi da contesto, e in particolare modo per i linguaggi liberi da contesto deterministici, sono stati sviluppati efficienti  algoritmi di parsing, sopratutto nell'ambito dei linguaggi di programmazione [Aho e Ullman 1972, Graham et al. 1980].

Sfortunatamente, a differenza dei linguaggi di programmazione, i linguaggi naturali non possono essere descritti con grammatiche libere da contesto.

Un metodo efficiente per l'analisi di frasi in linguaggio naturale e' l'approccio noto col nome di diagrammi di transizione estesi (ATN: augmented transition network) e sviluppato da W.Woods [1970]. Facendo riferimento ai primi lavori di Woods, definiamo diagramma di transizione di base(BTN: basic transition network) un insieme di diagrammi di transizione a stati finiti, ciascuno dei quali puo' essere visto come un grafo orientato con stati etichettati, arche etichettati, uno stato iniziale, ed un insieme di stati finali.

Il diagramma di transizione differisce da un automa a stati finiti in quanto permette delle ricorsioni, cioe' un elemento puo' essere trovato percorrendo ricorsivamente il diagramma, ed ogni volta con un nuovo stato di partenza.

Quando si incontra un arco ricorsivo di questo tipo, lo stato corrente del diagramma viene salvato in una memoria a pila prima di iniziare la ricorsione; quando viene raggiunto lo stato finale, trovando l'elemento desiderato ad un livello piu' basso di computazione, viene ripristinato lo stato precedentemente salvato (cioe' viene ripristinata la situazione del diagramma precedente alla ricorsione).

Le grammatiche costruite mediante questo formalismo sono state largamente usate sia in sistemi di comprensione del linguaggio naturale, sia in sistemi domanda-risposta; hanno dimostrato di essere flessibili e facili da interfacciare con altre componenti di un sistema piu' globale [Woods 1970,Woods 1973, Winograd 1975, Winograd 1983, Cappelli et al. 1982].

Data la varieta' di condizioni che possono essere associate ad un arco, una ATN e' formalmente equivalente ad una macchina di Turing.
 

DALLA SINTASSI ALLA GRAMMATICA

La generazione di un albero sintattico per una frase e' solo un primo passo verso l'interpretazione della frase stessa; questo processo di interpretazione che va sotto il nome di interpretazione semantica puo' avvenire in vari modi, che variano dal riconoscimento della struttura di una frase e la sua connessione con un mondo di conoscenze espresso in qualche formalismo, fino alla traduzione immediata della frase in una forma direttamente eseguibile da parte di un calcolatore.

Per produrre l'interpretazione di una frase un modo e' quello di dividere tale processo nelle tre fasi: analisi sintattica, semantica, pragmatica.

La maggior difficolta' di tale approccio sta, come gia' accennato, nell'impossibilita' di scegliere, molto spesso, una interpretazione sintattica senza considerare alcune informazioni semantiche e contestuali.

I vari metodi utilizzati per risolvere questo problema possono essere divisi in:

* grammatiche semantiche , che mescolano conoscenze sintattiche e semantiche in un insieme di regole grammaticali;
* grammatiche dei casi   , nelle quali la struttura costruita dal parse  contiene alcune informazioni di tipo semantico;
* filtri semantici, che operano sulle strutture sintattiche generate dal parser;
* riorganizzazione del processo di comprensione in modo tale che la comprensione stessa sia guidata piu' da conoscenze di tipo semantico, che non da quelle di tipo sintattico.
 
Una grammatica semantica e' una grammatica di tipo libero da contesto nella quale la scelta dei simboli non terminali e delle regole da applicare e' governata da funzioni non solo sintattiche ma anche semantiche.

Uno dei primi usi di grammatiche di questo tipo e' descritto in [Burton 1976]; tale grammatica e' stata utilizzata come interfaccia intelligente verso il sistema SOPHIE che aiuta gli studenti nell'analisi di circuiti elettronici.

Un'altra applicazione, molto piu' complessa, e' stata fatta nello sviluppo del sistema LADDER [Hendrix 1977a, Hendrix 1977b], nel quale e' previsto un accesso in linguaggio naturale verso una base di dati distribuita, utilizzata da ufficiali della marina americana, e contenente informazioni sugli armamenti e dislocazioni delle varie navi statunitensi e non.
 
Una grammatica semantica puo' essere usata in un sistema di parsing nello stesso modo nel quale viene usata una grammatica convenzionale.

I principali vantaggi di tali grammatiche possono essere riassunti in:

a)una volta completata l'analisi, il risultato puo' essere utilizzato direttamente senza successivi passi di elaborazione, altrimenti necessari se non viene fatta nessuna interpretazione semantica durante il parsing;
b)molte ambiguita' che si riscontrano durante l'analisi sintattica possono essere immediatamente superate senza dover generare piu' interpretazioni sintattiche, alcune delle quali prive di significato;
c)problemi sintattici che non hanno alcuna influenza sulla semantica
possono essere ignorati.

Esistono d'altra parte degli inconvenienti, per esempio, per tener conto di numerosi fattori semantici occorre aumentare notevolmente il numero di regole della grammatica; come conseguenza il processo di parsing risulta piu' laborioso.
 
Le grammatiche dei casi [Fillmore 1968, Bruce 1975] forniscono un approccio differente al problema di come l'interpretazione sintattica e semantica possono essere mescolate insieme.

In tali grammatiche le regole sono utilizzate per descrivere regolarita' sintattiche piu' che semantiche, ma le strutture prodotte dalle regole corrispondono piu' a relazioni semantiche tra gli elementi di una frase, che a relazioni strettamente sintattiche.

Tale modello si basa sulle seguenti assunzioni:
a)ogni frase del linguaggio e' composta da una "proposizione" e da "componenti di modo" (negazione, passato, futuro, ecc.); esempio:

                              "    Pietro non colpira' il ragazzo   "

in ogni proposizione ciascun caso deve comparire una sola volta (unicita' delle regole semantiche); l'insieme dei casi relativi ad un verbo e' chiamato  frame dei casi.

Il parsing mediante una grammatica dei casi avviene in modo expectation-driven ; una volta individuato il verbo della frase, questo viene utilizzato per riconoscere gli altri elementi e stabilire le sue relazioni con il resto della frase.

Una ATN fornisce una buona struttura per il parsing  di una frase basato su una grammatica dei casi.

A differenza degli algoritmi di parsing tradizionali in cui la struttura prodotta rispecchia la struttura delle regole grammaticali, una ATN permette di costruire, definendo opportunamente le azioni sugli archi,
strutture di forma arbitraria. Cfr., ad esempio, [Simmons 1973] in cui viene descritto un sistema che usa un parser ATN per tradurre frasi inglesi in una rete che rappresenta la struttura dei casi delle frasi
stesse. Tali reti vengono poi utilizzate per rispondere a domande sulle frasi.
 
Tradurre una frase in una reppresentazione di dipendenze concettuali e' un processo di parsing simile a quello utilizzato in una grammatica dei casi. In entrambi i casi il proceso di parsing e' pesantemente guidato da un insieme di aspettative generate sulla base del verbo principale della frase.

La teoria della dipendenza concettuale e' stata proposta da R.C. Schank [1973] allo scopo di fornire una adeguata rappresentazione del contenuto informativo di una frase, senza portare attenzione al modo in cui tale frase sia formulata; di conseguenza la proposta di Schank e' indipendente dalla particolare lingua ed ambisce a presentarsi come una teoria cognitiva.

Il significato di una frase, detto concettualizzazione , e' rappresentato da una rete che lega, mediante un certo tipo di connessioni, chiamate dipendenze, determinati elementi semantici (componenti concettuali).

Una dipendenza puo' anche legare due concettualizzazioni, introducendo nella teoria un certo elemento di ricorsivita', senza un limite superiore preciso. Alcuni componenti del mondo esterno, come individui, oggetti, ecc., vengono chiamati concetti.

Una concettualizzazione e' composta da un attore, una azione , e dei casi concettuali appartenenti ad un numero finito e piccolo di tipi, che sono specifici del particolare attore e della particolare azione.

Il modo in cui gli elementi di una concettualizzazione si compongono, e' guidato da una sintassi concettuale la quale e', nei suoi aspetti essenziali, di tipo libera da contesto. La presenza dei casi concettuali e di altre concettualizzazioni subordinate e' regolata  dalla semantica delle concettualizzazioni. Una semplificazione della sintassi concettuale utilizzata all'interno del sistema NAUSICA [Adorni e DiManzo 1980,Adorni et al. 1981a] e' la seguente:

concettualizzazione ---> casi_concettuali,stato,nesso_casuale.
casi_concettuali ---> caso,casi_concettuali.
casi_concettuali ---> caso.

caso ---> actor.         {attore dell'azione       }
caso ---> objective.     {obiettivo dell'azione    }
caso ---> recipient.     {transizione di un oggetto
                          da una certa origine     }
caso ---> directive.     {partenza e arrivo di
                          un'azione direzionale    }
caso ---> instrument.    {strumento dell'azione    }
 
 

actor ---> nominal,[act],azione,casi_concettuali.
objective ---> [obj],nominal.
recipient ---> [rec],[from],nominal,[to],nominal.
directive ---> [dir],[from],nominal,[to],nominal.
instrument ---> [instr],concettualizzazione.

azione ---> [atrans].   {trasferimento di possesso, controllo
                         o altra relazione di tipo astratto  }
azione ---> [ptrans].   {trasferimento della posizione
                         fisica di un oggetto                }
azione ---> [propel].   {applicazione di una forza fisica ad
                         un oggetto                          }
azione ---> [move].     {movimento di una parte di un animato
                         effettuato dall'animato stesso      }
azione ---> [grasp].    {azione fatta da un animato al fine
                         di afferrare un oggetto             }
azione ---> [mtrans].   {trasferimento di informazioni da un
                        animato ad un altro o tra parti del
                         sistema nervoso di uno animato      }
azione ---> [mbuild].   {azione fatta da un animato al fine
                        di costruire nuove informazioni
                         partendo da quelle vecchie          }
azione ---> [ingest].   {azione fatta da un animato al fine
                        di introdurre un oggetto all'interno
                         del proprio corpo                   }
azione ---> [expell].   {azione fatta da un animato al fine
                        di espellere un oggetto dal proprio
                         corpo                               }
azione ---> [speak].    {azione fatta da un animato al fine
                         di produrre un suono                }
azione ---> [attend].   {azione fatta da un animato al fine
                         di prestare attenzione ad uno
                         stimolo mediante un organo di senso }
azione ---> [do].       {azione provvisoria non meglio
                         specificabile                       }

nesso_casuale ---> relazione,concettualizzazione.
relazione ---> [scopo].
relazione ---> [implicazione].
relazione ---> [causa].

nominal ---> [...].     {oggetti animati e non animati       }
 

Mediante tale sintassi e' possibile analizzare la concettualizzazione della frase:

"     Giovanni mangia la torta con la forchetta   "

GIOVANNI act ingest
obj TORTA
dir
from FORCHETTA
to GIOVANNI
instr GIOVANNI act ptrans
obj FORCHETTA
dir
from FORCHETTA
to GIOVANNI
 
 

 PARSING IN PROLOG

In precedenza sono stati introdotti alcuni concetti sul come tradurre in Prolog grammatiche libere da contesto; in particolare e' stata introdotta la forma a clausole ed e' stato spiegato come costruire un albero sintattico; e' stato inoltre mostrato come, utilizzando un opportuno dizionario e delle restrizioni all'interno delle regole, e' possibile gestire in modo efficiente la pluralita' dei nomi.

Per esempio, per rappresentare una data composta da un numero intero compreso tra 1 e 31 che indica il giorno, seguita dal nome del mese, introducendo delle restrizioni sul numero potrei scrivere:

data(G,M) ---> mese(M),[G], {integer(G), sn(X,P1,P),sv(X,P1).
sn(X,P,P) ---> nome_proprio(X).
sn(X,S,P) ---> articolo(X,R,S,P1),
nome(x,L,R),compl(L,P1,P).
sv(X,P) ---> verbo(X,L,P1), sn(L,P1,P).
compl([],P,P) ---> [].
compl([K-X|L],P1,P) ---> caso(K9),
sn(X,P1,P2),compl(L,P2,P).
 
caso(oggetto) ---> [].
caso(dalla) ---> [dalla].
caso(da) ---> [da].
caso(di) ---> [di].
 
articolo(X,R,S,ogni(X,R,S)) ---> [ogni].
articolo(X,R,S,un(X,R,S)) ---> [un].
 
nome_proprio(giovanni) ---> [giovanni].
nome(X,[],regalo(X)) ---> [regalo].
nome(X,[],bambino(X)) ---> [bambino].
nome(Y,[di-X],madre_di(X,Y)) ---> [madre].
 
verbo(X,[oggetto-Y,dalla-Z],riceve(X,Y,Z)) --->[riceve].

Utilizzando tale grammatica si possono ottenere i seguenti risultati:

"     Giovanni riceve un regalo dalla madre di ogni bambino   "

ogni

B bambino(B) dalla

M madre_di(B,M) un

T regalo(T) riceve(giovanni,T,M)
 
ogni

B bambino(B)  un

T regalo(T) riceve(B,T,giovanni)
 
 

Poiche' la formula in clausole e' alla base del Prolog, una grammatica rappresenta direttamente un programma Prolog, permettendo di costruire algoritmi di parsing efficienti. E' anche possibile, naturalmente,
costruire altri algoritmi di parsing. Di seguito viene presentato un programma che realizza un parser bottom-up [Aho e Ullman 1972].

parsing(Inizio,Stringa,Derivazione) :-
muovi([Inizio],Derivazione,Stringa,[]).
muovi([],[],S,S).
muovi(P0,R,S0,S) :- passo(P0,P1,S0,S1),muovi(P1,R,S1,S).
muovi(P0,[I|R],S0,S) :- regola(I,P0,P1),muovi(P1,R,S0,S).
 
passo([T|P],P,[T|S],S).
passo([A/A|P],P,S,S).

Tale programma realizza un automa non deterministico a pila. L'automa per un particolare linguaggio viene definito dal predicato "regola" i cui argomenti rappresentano rispettivamente un identificatore della regola, una pila di lavoro, ed una pila di aggiornamento. Elementi della pila della forma "obiettivo/successo" stanno ad indicare che il successo e' stato raggiunto durante la ricerca dell'obiettivo. Volendo realizzare la seguente
grammatica per semplici espressioni aritmetiche:

e ---> e, [+], t.
e ---> t.
t ---> f, [*], t.
t ---> f.
f ---> [<], e, [>].
f ---> [a].

occorre definire le seguenti regole:
    regola(1,[C/e|P],[+,t,C/e|P]).       { e ---> e + t }
    regola(2,[C/t|P],[C/e|P]).             { e ---> t     }
    regola(3,[C/f|P],[*,t,C/t|P]).          { t ---> f * t }
    regola(4,[C/f|P],[C/t|P]).              { t ---> f     }
regola(5,[C|P],[<,e,>,C/f|P]) :-
nonterminale(c). { f ---> < e > }
regola(6,[C|P],[a,C/f|P]) :-
nonterminale(c). { f ---> a     }
nonterminale(e).
nonterminale(t).
nonterminale(f).

Si e' detto in precedenza che i linguaggi naturali non sono linguaggi liberi da contesto. E' possibile pero' utilizzare grammatiche libere da contesto per esprimere alcuni aspetti dei linguaggi naturali. Nel
paragrafo successivo viene riportata la sintassi libera da contesto per un sottoinsieme della lingua italiana la quale consente di esprimere frasi interrogative, frasi imperative, e frasi dichiarative attive senza ricursioni sulle frasi relative.

Tale sintassi e' stata ampiamente verificata in un sistema di interrogazione di basi di dati [Adorni e Ferrari 1984], e come interfaccia verso un modulo grafico tridimensionale [Adorni e Massone 1985].
 

UNA GRAMMATICA PER L'ITALIANO

In questo paragrafo viene riportata una grammatica libera da contesto per un sottoinsieme della lingua italiana. Per renderne piu' semplice la lettura, si e' ritenuto opportuno non esplicitare all'interno della grammatica gli extra argomenti; per fare in modo che la grammatica sia un programma Prolog    direttamente funzionante e' sufficiente quindi introdurre in ogni predicato gli opportuni argomenti.
Per quanto riguarda le applicazioni all'italiano delle regole grammaticali espresse in Prolog, abbiamo preso in considerazione in particolare alcune tipologie di frasi quali:

1. TRANSITIVE: sono presenti verbi che esprimono un'azione che dal soggetto passa direttamente sull'oggetto, cioe' su chi la riceve.
ES. Elena scrive una lettera.
2. INTRANSITIVE: il verbo esprime uno stato o un'azione che non passa direttamente sull'oggetto, ma si esaurisce direttamente sul soggetto che la compie.
ES. Elena ride.
3. RELATIVE: c'è un pronome relativo che sostituisce un nome e nello stesso tempo mette in relazione proposizioni congiungendole in un'unica frase.
ES. Ho visto Paolo che usciva.
4. INFINITIVE: il verbo esprime un'azione attraverso l'uso dell'infinito.
ES. Il ragazzo dice di mangiare.
5. FRASI COMPLEMENTO: il complemento oggetto anziché supportare un nome si riferisce ad una frase.
ES. Paolo dice che Giovanni va a scuola.

Per costruire queste tipologie di frasi abbiamo preso in considerazione alcune elementi comuni, come possono essere:

* SOGGETTO: si riferisce a cio' di cui si parla.
* VERBO: si riferisce a cio'che si dice del soggetto.
* OGGETTO: si riferisce a cio' che specifica la frase.

Nel programma sono presenti alcuni meccanismi particolari, come possono essere le liste di estraposizione e i controlli semantici.

Le liste di estraposizione sono un concetto che viene utilizzato in presenza di frasi relative nelle quali a seconda che ci riferiamo ad un soggetto o ad un oggetto questi vengono analizzati all'inizio o in coda  alla frase.

Per quanto riguarda i controlli semantici possiamo individuare un paio di argomenti sui quali vale al pena di soffermarsi; il primo sono sicuramente le parentesi graffe tra le quali viene racchiuso il controllo vero e proprio.

L'altro particolare sul quale ci soffermeremo sono i pred; per quanto riguarda quelli riferiti al verbo definiscono la lista dei possibili soggetti e oggetti che possono essere supportati dal verbo in questione, in particolare i pred di nome definiscono il tipo di nome.

In entrambi i programmi realizzati che si riferiscono rispettivamente ad un file con e senza i controlli semantici; il modo corretto e piu'  veloce per lanciare un goal; cioè chiedere l'analisi di un a frase è il seguente:
frase(numero della frase in questione).

Riportiamo di seguito alcuni esempi per ciascuna tipologia di frase presa in considerazione:

/*TRANSITIVA*/
ff(1,[mario,legge,il,rapporto]).

/*INTRANSITIVA*/
ff(2,[il,ragazzo,corse,a,casa]).

/*RELATIVA*/
ff(3,[il,padrone,mangia,la,mela,che,gino,ha,perso]).

/*INFINITIVA*/
ff(4,[lo,studente,dice,di,sapere,la,storia]).

/*FRASE COMPLEMENTO*/
ff(5,[il,delegato,ritiene,che,la,casa,sia,del,suocero]).