Istruzioni sull'uso di ECLiPSe
Questo documento vuole fornire qualche indicazione e sottolineare alcuni aspetti a proposito del sistema ECLiPSe, pur non volendo e non potendo proporsi in alternativa al manuale del sistema. Il sistema ECLiPSe è installato sulle macchine dei laboratori di informatica.
Avvio di ECLiPSe
Il sistema viene avviato, al prompt della shell, dal comando eclipse. All'avvio il sistema si identifica e presenta il proprio prompt, con un output del tipo
ECLiPSe Constraint Logic Programming System [kernel]
Copyright Imperial College London and ICL
Certain libraries copyright Parc Technologies Ltd
GMP library copyright Free Software Foundation, see lib_public/COPYING.LIB
Version 5.7 #65, Sat Oct 9 00:08 2004
[eclipse 1]:
Caricamento di programmi
I programmi Prolog possono essere caricati nel sistema mediante la stringa nome file (precedentemente salvato come .pl o .ecl) tra parentesi quadre:
[eclipse 2]: [esercizio].
esercizio.pl compiled traceable 672 bytes in 0.00 seconds
yes
[eclipse 3]:
Il sistema compila in un codice intermedio il programma esercizio.pl (si noti che l'estensione è fissa e non va specificata) cercandolo nella directory corrente.
Tracing
Il comando trace
consente di seguire passo passo la risoluzione delle clausole; tale modalità può poi essere disabilitata con il comando notrace
.
Uso della libreria su domini finiti
ECLiPSe fornisce un risolutore di vincoli su domini finiti. Tale risolutore è fornito come libreria che si carica tramite il comando:
[eclipse 2]: lib(fd).
/opt/eclipse/lib/structures.pl compiled traceable 5436 bytes in 0.05 seconds
/opt/eclipse/lib/sorts.pl compiled traceable 1028 bytes in 0.01 seconds
/opt/eclipse/lib/fd_domain.sd loaded traceable 28984 bytes in 0.23 seconds
/opt/eclipse/lib/fd_arith.sd loaded traceable 70028 bytes in 0.57 seconds
/opt/eclipse/lib/fd_util.pl compiled traceable 1944 bytes in 0.03 seconds
/opt/eclipse/lib/fd_chip.pl compiled traceable 3936 bytes in 0.08 seconds
/opt/eclipse/lib/fd_elipsys.pl compiled traceable 10776 bytes in 0.07 seconds
/opt/eclipse/lib/fd.sd loaded traceable 18976 bytes in 0.81 seconds
yes.
[eclipse 4]:
A questo punto possono essere definite variabili con dominio tramite la sintassi del tipo:
[eclipse 4]: X::[1..10], Y::[3,4,9].
X = X{[1..10]}
Y = Y{[3, 4, 9]}
yes.
e vincoli. Si noti che i vincoli matematici sono sempre preceduti dal simbolo #
in modo da differenziarli dai predicati di Prolog che agiscono come test ma non hanno nessun meccanismo di propagazione associato.
[eclipse 4]: X::[1..10], Y::[1..10], Y#>X.
X = X{[1..9]}
Y = Y{[2..10]}
Delayed goals:
Y{[2..10]} - X{[1..9]}#>=1
yes.
[eclipse 5]:
In questo esempio il vincolo non è risolto e viene addormentato (delayed goal). Nel caso in cui avvenisse un qualche evento su una delle due variabili, il vincolo sarebbe risvegliato ed effettuerebbe di nuovo la propagazione. Ad esempio, il vincolo X#>5
nel seguente programma modifica il dominio di X
che risveglia il vincolo tra X
e Y
che di nuovo effettua la propagazione e si riaddormenta.
[eclipse 4]: X::[1..10], Y::[1..10], Y#>X, X#>5.
X = X{[6..9]}
Y = Y{[7..10]}
Delayed goals:
Y{[7..10]} - X{[6..9]}#>=1
yes.
[eclipse 5]:
ECLiPSe fornisce inoltre predicati per la ricerca. Esiste un predicato indomain(X)
che istanzia la variabile X
a un valore del suo dominio (e in backtracking agli altri).
[eclipse 4]: X::[1..10],Y::[1..10], Y#>X, X#>5, indomain(X).
Y = Y{[7..10]}
X = 6 More? (;)
Y = Y{[8..10]}
X = 7 More? (;)
Y = Y{[9, 10]}
X = 8 More? (;)
Y = 10
X = 9
yes.
[eclipse 5]:
Infine, viene fornito un predicato labeling(List)
che effettua una indomain
su tutte le variabili contenute nella lista List
.
ECLiPSE Prolog User's Manual
Si ricorda nuovamente che la guida di riferimento rimane comunque il manuale utente fornito a corredo del sistema disponibile in laboratorio.
Ulteriori informazioni sono disponibili alla pagina web di ECLiPSe con alcuni esempi di programmi.