Laboratorio di Programmazione - A.A. 2004/05

Esercizio d'esame

Piani robotici

 

Il controllo di alto livello di un robot può essere effettuato usando dei piani condizionali che descrivono il comportamento del robot nell'esecuzione del suo compito. I piani condizionali sono rapresentati mediante alberi binari in cui ciascun nodo rappresenta uno stato di esecuzione e la corrispondente azione che il robot deve compiere, il nodo radice corrisponde allo stato iniziale e le foglie corrispondono al raggiungimento di un determinato obiettivo (quindi non si dovranno eseguire azioni in corrispondenza delle foglie). L'albero vuoto non è significativo, un piano che non deve svolgere alcuna operazione contiene un solo nodo senza azioni da esguire.

I nodi intermedi dell'albero (cioè le non foglie) sono distinti in due classi: 1) se hanno un solo nodo figlio, allora essi rappresentano azioni ordinarie, cioè azioni che saranno eseguite e porteranno il robot in un unico stato successore che è rapresentato dall'unico nodo figlio; 2) se hanno due figli, allora essi rappresentano una azione di percezione, che determina un meccanismo di decisione per cui a seconda del risultato della percezione si eseguira la parte di piano contenuta in un sottoalbero piuttosto che nell'altro. In altri termini le azioni ordinarie possono essere considerate come l'esecuzione di un comando di alto livello per il robot, mentre le azioni di percezione permettono di verificare una qualche proprietà sull'ambiente e decidere il comportamento in sonsequenza del risultato della percezione.

Parte 1

Determinare la struttura dati necessaria per rappresentare i piani condizionali e scrivere una classe PianoRobot che implementi le seguenti funzioni:

- crea(), che crea un piano vuoto;
- crea(AzioneOrdinaria a, PianoRobot p), che crea un piano contenente un'azione ordinaria seguita dal piano p;
- crea(AzionePercezione a, PianoRobot p1, PianoRobot p2), che crea un piano contenente un'azione di percezione seguita dal piano p1 se la percezione è verificata e dal piano p2 altrimenti;
- terminato(), che verifica se il piano è terminato, ovvero se non ci sono azioni da eseguire (albero con un solo nodo);
- primaAzione(), che restituisce la prima azione da eseguire (ovvero quella rappresentata nella radice), oppure genera una eccezione se il piano è terminato;
- azioneEseguita(), se la prima azione del piano è ordinaria allora restituisce un piano in cui è stata eliminata tale azione, altrimenti genera una eccezione;
- azioneEseguita(boolean f), se la prima azione del piano è di percezione allora restituisce il piano associato al risultato della percezione denotato dal valore booleano f (cioè f rappresenta il risultato della percezione che consente di decidere quale piano deve essere eseguito), altrimenti genera una eccezione;

 

Parte 2

Un piano condizionale può essere scritto sotto forma di un programma in un linguaggio di programmazione ad alto livello usando i costrutti sequenza e if-else. Un linguaggio per descrivere piani condizionali in questo formalismo è definito dalla seguente grammatica

P -> { A
A -> } | if a P else P } | a ; A

Scrivere una classe EsecuzionePianiRobot contenente i seguenti metodi statici:
- leggiPiano(String programma), che restituisce un PianoRobot associato al programma scritto nel linguaggio definito sopra e memorizzato nella stringa programma.
- scriviPiano(PianoRobot p), che restituisce una stringa con il piano p nel linguaggio definito sopra;
- eseguiPiano(PianoRobot p, Map pmap), che simula l'esecuzione del piano p stampando su video le azioni che verranno eseguite a fronte dei risultati delle percezioni indicati nella Map pmap, che contiene l'associazione tra le azioni di percezione del piano e i valori booleani corrispondenti ai loro risultati.