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]).