L'answer set programming (ASP) è una forma di programmazione logica di tipo dichiarativo utilizzato per problemi di ricerca complessi (in primis NP-difficili), basata sulla semantica del modello stabile (o answer set).[1] In ASP i problemi di ricerca sono ridotti al calcolo di modelli stabili; per generare tali modelli vengono utilizzati programmi appositi noti come answer set solvers. Il linguaggio tipico di questo modello di programmazione è l'Answer Set Programming in Logic (AnsProlog), sottoinsieme del Prolog, ed è impiegato in particolare per risolvere problemi di pianificazione (planning) e rappresentazione della conoscenza.[1]
Storia
[modifica | modifica wikitesto]Il metodo di planning proposto nel 1993 da Dimopoulos, Nebel e Köhler[2], basato sulla stretta relazione tra le pianificazioni e i modelli stabili,[3] costituì uno dei primi esempi di answer set programming. L'utilizzo di answer set per risolvere problemi di ricerca fu proposto come nuovo paradigma da Marek e Truszczyński, la cui teoria apparve inizialmente nel 1999 su due differenti pubblicazioni.[4][5] L'espressione "answer set" come sinonimo di "stable model" fu proposta da Lifschitz.[6]
AnsProlog
[modifica | modifica wikitesto]Lparse è il nome del programma che è stato creato in origine per l'answer set solver smodels. Il linguaggio che Lparse accetta è AnsProlog. Un programma in AnsProlog consiste di regole scritte nella forma:
<head> :- <body> .
Il simbolo :-
("if") è omesso se <body>
è vuoto; tali regole, come in Prolog, vengono chiamati fatti.
Un altro tipo di costrutto è la scelta. Ad esempio, la regola:
{p,q,r}.
afferma: scegli arbitrariamente quali fra gli atomi includere nel modello stabile. Un programma contenente solo questa regola ha 8 modelli stabili, sottinsiemi di . Il significato di questa regola nella semantica del modello stabile è rappresentato dalla formula proposizionale:
È possibile, inoltre, imporre dei vincoli alle regole di scelta, come:
1{p,q,r}2.
Tale regola afferma: scegli almeno uno degli atomi , ma non più di due. Il significato in logica proposizionale è dato dalla seguente formula:
I vincoli di cardinalità possono essere usati anche nel corpo della regola, ad esempio:
:- 2{p,q,r}.
Questo vincolo impone al programma di eliminare i modelli stabili contenenti almeno due atomi appartenenti all'insieme . Il significato in logica proposizionale è dato dalla seguente formula:
Le variabili (con iniziale maiuscola, come in Prolog) sono utilizzate per abbreviare collezioni di regole che seguono lo stesso schema, oppure per abbreviare collezioni di atomi all'interno della stessa regola. Ad esempio, il programma:
p(a). p(b). p(c).
q(X) :- p(X), X!=a.
ha lo stesso significato di:
p(a). p(b). p(c).
q(b). q(c).
Il programma:
p(a). p(b). p(c). p(d). p(e).
{q(X):-p(X)}2.
è un'abbreviazione di:
p(a). p(b). p(c). p(d). p(e).
{q(a),q(b),q(c),q(d),q(e)}2.
Un intervallo è espresso nella forma:
(start..end)
dove start
e end
sono espressioni aritmetiche dal valore costante. Un intervallo è un'abbreviazione notazionale per definire domini numerici. Ad esempio, il fatto:
a(1..3).
è un'abbreviazione di:
a(1). a(2). a(3).
Generazione di modelli stabili
[modifica | modifica wikitesto]Utilizzando il software Lparse[7] per generare un modello stabile del programma memorizzato nel file dal titolo <filename>
si utilizza il comando:
% lparse <filename> | smodels
L'opzione 0
indica alla funzione smodels
di trovare tutti i modelli stabili del programma.
Ad esempio, dato il seguente programma contenuto nel file "test":
1{p,q,r}2.
s :- not p.
utilizzando il comando
% lparse test | smodels 0
verrà prodotto l'output
Answer: 1
Stable Model: q p
Answer: 2
Stable Model: p
Answer: 3
Stable Model: r p
Answer: 4
Stable Model: q s
Answer: 5
Stable Model: r s
Answer: 6
Stable Model: r q s
Applicazioni
[modifica | modifica wikitesto]L'answer set programming, oltre ad avere riscontro nella rappresentazione della conoscenza, può essere anche utilizzato per risolvere problemi computazionalmente difficili, come il problema della colorazione dei grafi, del cammino hamiltoniano o di soddisfacibilità booleana.[8]
Colorabilità
[modifica | modifica wikitesto]La -colorabilità di un grafo è una funzione tale che per ogni coppia di vertici adiacenti . È possibile utilizzare ASP per trovare una -colorazione di un dato grafo, o dimostrare che essa non esiste.
Per fare ciò, basta un breve programma in AnsProlog:
c(1..n).
1 {color(X,I) : c(I)} 1 :- v(X).
:- color(X,I), color(Y,I), e(X,Y), c(I).
Nella riga 1 vengono definiti colori differenti. La regola presente in riga 2 si occupa di colorare i vertici, ovvero assegna un colore ad ogni vertice . Il vincolo nella riga 3 proibisce di assegnare lo stesso colore a due vertici e se sono connessi da un arco del grafo.
Definendo un grafo nella maniera seguente:
v(1..100). % 1,...,100 sono vertici
e(1,55). % esiste un arco che connette 1 e 55
. . .
ed eseguendo il comando smodels, con il valore numerico di specificato a linea di comando, allora, se esiste una soluzione, verranno stampati in output degli atomi dalla forma color(. , .)
, i quali indicano le assegnazioni colore-vertice da eseguire per ottenere la colorazione di cardinalità indicata.
Cammino hamiltoniano
[modifica | modifica wikitesto]Dato un grafo orientato e uno specifico vertice di partenza , il cammino hamiltoniano su tale grafo è un percorso che ne includa tutti i vertici partendo da .
In Prolog il problema può essere modellato come segue:
dentro(X,Y) | fuori(X,Y) :- arco(X,Y). % ogni arco può essere dentro o fuori dal percorso.
:-dentro(X,Y), dentro (X,Y1), Y<>Y1. % partendo da un vertice non si può giungere a due vertici distinti.
:-dentro(X,Y), dentro (X1,Y), X<>X1. % partendo da due vertici distinti non si può giungere allo stesso vertice.
:-nodo(X), not raggiunto(X). % un vertice non può non essere raggiunto.
:-dentro(X,Y), partenza(Y). % il vertice di partenza non può essere raggiunto da nessun altro vertice.
raggiunto(X) :- partenza(X). % il punto di partenza è raggiunto per definizione.
raggiunto(X) :- raggiunto(Y), dentro(Y,X). % partendo da un vertice Y e arrivando ad un vertice X, quest'ultimo è raggiunto.
Note
[modifica | modifica wikitesto]- ^ a b Valentina Pitoni, Answer Set Programming (PDF), Università degli Studi dell'Aquila. URL consultato il 4 aprile 2016 (archiviato dall'url originale il 4 novembre 2016).
- ^ (EN) Y. Dimopoulos, B. Nebel e J. Köhler, Encoding planning problems in non-monotonic logic programs, in Sam Steel e Rachid Alami (a cura di), Recent Advances in AI Planning: 4th European Conference on Planning, ECP'97, Toulouse, France, September 24–26, 1997, Proceedings, Lecture notes in computer science: Lecture notes in artificial intelligence, vol. 1348, Springer, 1997, pp. 273–285, ISBN 978-3-540-63912-1. as Postscript
- ^ (EN) V.S. Subrahmanian e C. Zaniolo, Relating stable models and AI planning domains, in Leon Sterling (a cura di), Logic Programming: Proceedings of the Twelfth International Conference on Logic Programming, MIT Press, 1995, pp. 233–247, ISBN 978-0-262-69177-2. as Postscript
- ^ (EN) V. Marek e M. Truszczyński, Stable models and an alternative logic programming paradigm, in Krzysztof R. Apt (a cura di), The Logic programming paradigm: a 25-year perspective (PDF), Springer, 1999, pp. 169–181, ISBN 978-3-540-65463-6.
- ^ (EN) I. Niemelä, Logic programs with stable model semantics as a constraint programming paradigm, in Annals of Mathematics and Artificial Intelligence, vol. 25, 1999, pp. 241–273, DOI:10.1023/A:1018930122475. (PostScript)
- ^ (EN) V. Lifschitz, Action Languages, Answer Sets, and Planning, 1999.
- ^ Lparse (ps), su tcs.hut.fi, Aalto-yliopisto - Laboratory of Theoretical Computer Science. URL consultato il 4 aprile 2016 (archiviato il 20 marzo 2016). (PostScript)
- ^ (EN) Modelling Problems in ASP (PDF), su cs.sfu.ca, Simon Fraser University. URL consultato il 4 aprile 2016 (archiviato il 4 aprile 2016).