Laboratorio di Programmazione - A.A. 2004/05
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.