Un robot con una grande borsa si può spostare tra diversi posti, mettere
oggetti dentro la borsa e toglierli dalla borsa.
Si rappresenti il dominio,
utilizzando:
- i fluenti
atRobby(X,S) (il robot è nel posto X), at(X,Y,S)
(l'oggetto X è nel posto Y) e in(X,S) (l'oggetto X è
dentro la borsa);
le azioni go(X,Y) (il robot va dal posto X al posto Y),
take(X,Y) (il robot prende l'oggetto X che si trova nel posto Y
e lo mette nella borsa, e drop(X,Y) (il robot, trovandosi
nel posto Y, tira fuori
dalla borsa l'oggetto X).
Si scrivano le seguenti procedure:
- goto(Loc): il robot va nel posto Loc. Se già si trova in
Loc, non viene eseguita alcuna azione, ma la procedura ha successo
cumunque.
- prendi(X): il robot va a prendere l'oggetto X e lo mette
nella borsa. Fallisce se X è già nella borsa.
- porta(X,Y): il robot va a prendere l'oggetto X e lo porta
nel posto Y. Se X già si trova in Y non viene eseguita alcuna
azione (la procedura ha successo comunque).
- svuota: il robot svuota la borsa nel posto in cui si
trova. Scrivere due versioni della procedura, una che utilizzi il
costrutto while e una ricorsiva. Per implementare
quest'ultima, si utilizzi una funzione ausiliaria con un parametro
Loc, mediante la quale il robot svuota la borsa nel posto Loc (in cui si trova).
- prenditutti(Loc): il robot va (se già non vi si trova)
nel posto Loc e raccoglie nella borsa tutti gli
oggetti che vi si trovano. Anche in questo caso, implementare
due versioni della procedura, con e senza il costrutto while. Nella versione ricorsiva, utilizzare un'opportuna
procedura ausiliaria che realizza il ``ciclo''.
- portatutti(Dest): il robot raccoglie tutti gli oggetti che
ci sono in giro e li porta nel posto Dest.
- raccogli(List), dove List è una lista (Prolog) di
oggetti: il robot svuota la borsa e poi
raccoglie e mette nella borsa tutti gli oggetti
che sono in List.
- portalista(List,Dest): il robot porta nel posto Dest tutti
gli oggetti della lista List.
Soluzione proposta
marta
2012-04-17