I SISTEMI BASATI SULLA CONOSCENZA
4. La programmazione logica (cenni)
In Europa, la fase menzionata nel paragrafo 3.2 precedente non ebbe l'importanza che rivesti negli Stati Uniti. Le ricerche di intelligenza artificiale continuarono a rivolgersi soprattutto verso l'elaborazione di metodi e tecniche ispirate alla logica.
Tali ricerche condussero allo sviluppo della programmazione logica in senso stretto, cioè all'uso di un sottoinsieme determinato della logica dei predicati, le clausole di Horn, come linguaggio di programmazione8. La più importante realizzazione in questa direzione fu un nuovo linguaggio di programmazione, il PROLOG. Il PROLOG, sul quale ci diffonderemo più ampiamente nel seguito, è un linguaggio di programmazione particolare: riprende taluni aspetti dalla logica dei predicati, altri dalla programmazione tradizionale: in questo senso è un linguaggio di programmazione logica.
Come i sistemi realizzati sulla base degli approcci menzionati sub 2 e 3, anche un programma in PROLOG
7C f r . BUCHANAN B., SHORTLIFFE E., Rule-Based Expert Systems, Addison- Hesley, Reading (Massachusetts), 1984.
8Sulla programmazione logica e, in particolare, sul PROLOG, cfr. cap. 7 par. 2.
rappresenta una soluzione di compromesso tra la tendenza alla generalità e l'uso di metodi di ragionamento specifici: esso unisce aspetti dichiarativi e aspetti procedurali, sfrutta un metodo generale di inferenza incorporato nello stesso PROLOG, ma in una sequenza definita dal programma. La relazione con la logica matematica consente tuttavia - in contrasto con il carattere prevalentemente pragmatico di quegli approcci - di dare una solida base teorica alla programmazione (ad esempio, la semantica del programma, ciò che esso significa, può essere studiata a prescindere dal particolare sistema di calcolo, nei termini della teoria logico-matematica dei modelli). Il PROLOG, benché sviluppato per applicazioni nei settori del trattamento del linguaggio naturale e della dimostrazione automatica di teoremi, ha trovato applicazioni sempre più ampie9.
Si tratta di un linguaggio di tipo generale: come negli altri linguaggi di programmazione evoluti, in linea di principio, ogni algoritmo è esprimibile anche in PROLOG; numerosi problemi, in particolare per applicazioni di intelligenza artificiale, si possono tuttavia formulare in modo molto più semplice che nei linguaggi tradizionali.
Come si è già osservato, un programma PROLOG unisce aspetti dichiarativi e aspetti procedurali. Il programma può essere interpretato come:
(a) un insieme di enunciati che descrivono il problema da risolvere e il suo contesto (una base di conoscenza) . Il sistema PROLOG (che opera come un motore inferenziale, in base ad uno schema logico generale deduce la soluzione del problema da questa descrizione.
(b) un insieme di procedure, la cui esecuzione realizza la soluzione del problema.
La considerazione dell'aspetto dichiarativo consente una chiara definizione del problema, la considerazione dell'aspetto procedurale consente di tener conto degli aspetti di efficienza.
Un programma in PROLOG, in un certo senso, è già un sistema di conoscenza. Un uso diretto del PROLOG presenta tuttavia taluni problemi:
-L'unione di aspetti dichiarativi e procedurali, può essere utile in un linguaggio di programmazione, ma può rivelarsi controproducente nello sviluppo di una base di conoscenza. Tenuto conto delle diverse competenze dei soggetti coinvolti (esperto, ingegnere della conoscenza, programmatore) nella realizzazione di un sistema esperto, è preferibile che l'esperto sia il più possibile autonomo nella creazione e nell'aggiornamento della base di conoscenza. A tal fine sarebbe utile consentirgli di
9In particolare, è stato scelto nel famoso progetto giapponese degli elaboratori della quinta generazione.
astrarre dagli aspetti procedurali, per concentrarsi sulla formalizzazione delle conoscenze rilevanti. Conseguentemente sarebbe interessante poter incorporare le conoscenze procedurale in un motore inferenziale che sia, più specifico, cioè adeguato al particolare tipo di problema, ma che consenta metodi di formalizzazione della conoscenza indipendenti dall'uso della conoscenza stessa10.
-Il linguaggio delle clausole di Horn, sul quale è basato il PROLOG, pud sembrare insufficiente per la rappresentazione di conoscenze complesse.
Una soluzione pud consistere nell'uso del PROLOG (o un altro linguaggio di programmazione logica) come un metalinguaggio, uso per il quale il PROLOG è particolarmente adatto (come si osservava, tra le prime applicazione del PROLOG vi fu l'analisi del linguaggio naturale). Il PROLOG può cioè essere usato per la metaprogrammazione, cioè per sviluppare programmi in grado di manipolare conoscenza formulata in diversi linguaggi.
Possiamo facilmente scrivere in PROLOG un interprete11 per il PROLOG o per altri linguaggi. Il motore inferenziale scritto in PROLOG consisterà di metaconoscenza (regole relative all'uso della conoscenza), che indica il modo nel quale enunciati del linguaggio di partenza (della base di conoscenza), debbono essere trasformati in enunciati direttamente eseguibili da parte del motore inferenziale del PROLOG (cioè in enunciati, o clausole, in PROLOG). La tecnica della metaprogrammazione è uno strumento estremamente flessibile, che consente di realizzare qualsiasi motore inferenziale, in molti casi con un'efficienza accettabile. Usando questa tecnica sono stati scritti, ad esempio, programmi che riproducono il funzionaunento dei motori inferenziali di alcuni tra i più noti sistemi esperti, come, ad esempio, il già menzionato EMYCIN.
La programmazione logica è ancora agli inizi (il primo sistema PROLOG fu realizzato alla metà degli anni 70) . Il PROLOG fu concepito dai sui stessi inventori come una soluzione provvisoria, una prima approssimazione nella direzione dell'uso della logica come linguaggio di programmazione. Invece, esso ha trovato un enorme successo e si è rivelato adeguato per un'ampia gamma di applicazioni.
Tuttavia, non sono mancate le ricerche volte a modificare il meccanismo di deduzione del PROLOG o ad
10In realtà, risulta difficile prescindere completamente dall'aspetto procedurale.
u Un interprete è un programma che accetta come input gli enunciati di un certo linguaggio e li trasforma in enunciati - o "istruzioni", come si suole dire - direttamente eseguibili da parte del sistema di calcolo.
ampliare il linguaggio della programmazione logica12. Queste ricerche sono particolarmente importanti al fine dello sviluppo di applicazioni giuridiche, poiché il diritto è un settore particolarmente complesso, e rispetto ad esso alcuni limiti del PROLOG appaiono con maggiore evidenza13.
12Illustreremo ampiamente, nel cap. 8 par. 2.3, una recente proposta in questa direzione, sviluppata da L.T. McCarty tenendo conto proprio delle applicazioni informatico-giuridiche .
13Alcuni problemi della rappresentazione della conoscenza giuridica in PROLOG saranno considerati nel cap. 8 par. 6.