L’ Agente Tartaruga Alessandro Serra 3 ottobre 2010 Sommario L’ora è giunta! Diamo vita al nostro primo agente. “Un giorno le macchine riusciranno a risolvere tutti i problemi, ma mai nessuna di esse potrà porne uno.” Albert Einstein 1 L’agente tartaruga Il primo agente di cui parliamo è una tartaruga (vedere figura 1) ed è orientato alla grafica e alla geometria di base. Per evitare ogni ambiguità, forniamo le descrizioni PAGE e PLAP. Figura 1: L’agente tartaruga. Descrizione 1 (PAGE della tartaruga). Descrizione PAGE della tartaruga: • perceptions nessuno • actions – muoversi in avanti di x unità lasciando una scia – muoversi in avanti di x unità senza lasciare una scia – muoversi in avanti di x unità cancellando la scia precedentemente lasciata – girarsi in senso antiorario di g gradi • goals disegnare una data figura geometrica • environment un pavimento bianco Descrizione 2 (PLAP della tartaruga). Descrizione PLAP della tartaruga: • programming language Scheme • language primitive primitive per il controllo della tartaruga: – (draw x) → void? x:real? la tartaruga si muove in avanti di x unità lasciando una scia – (move x) → void? x:real? la tartaruga si muove in avanti di x unità senza lasciare una scia 1 – (turn g) → void? g:real? la tartaruga si gira in senso antiorario di g gradi – (erase x) → void? g:real? la tartaruga si muove in avanti di x unità cancellando la scia precedentemente lasciata primitive per il controllo dell’ambiente virtuale: – (turtles on) → void? on:any/c (turtles) → void? Mostra e nasconde la finestra della tartaruga a seconda del valore vero (#t) o falso (#f) di on. Se on non è specificato, lo stato è invertito. – (turtles) → void? inizializza il pavimento e lo mostra in una finestra – (home) → void? teletrasporta la tartaruga nella posizione iniziale – (clear) → void? pulisce il pavimento La nostra tartaruga è in grado di parlare in Scheme [4]. Nelle prossime sezioni introdurremo questo linguaggio di programmazione per fasi partendo da un linguaggio minimale che chiameremo EasyScheme versione 1. 2 Turtle in DrScheme Nel laboratorio programmeremo il nostro agente tartaruga utilizzando DrRacket [3, 1]. Per utilizzare la versione originale della tartaruga [2] utilizzare la seguente espressione: (require graphics/turtles) In questa vesrione non c’è il repeat. Per aggiungerlo utilizzare la seguente espressione: (define-syntax repeat (syntax-rules () ((repeat n body ...) (let loop ((i 0)) (when (< i n) (begin body ... (loop (+ i 1)))))))) In laboratorio, utilizzeremo una versione leggermente modificata (ad esempio è stata aggiunta la macro repeat), che può essere caricata con: (require gas/turtles) 3 EasyScheme versione 1.0 Questa prima versione di EasyScheme è in grado di riconoscere e valutare tutte le espressioni primitive e le sequenze di espressioni. Descrizione 3 (EasyScheme 1.0). EasyScheme 1.0 è in grado di riconoscere e valutare: • espressioni primitive (move, draw, turn, erase, turtles, home, e clear) • sequenze di espressioni (begin espressione espressione . . . ) – le espressioni sono valutate sequenzialmente da sinistra a destra – la valutazione della sequenza coincide con la valutazione dell’ultima espressione – spesso l’uso di begin è implicito e può essere omesso Esempio 1 (EasyScheme 1.0). Espressioni che disegnato alcuni poligoni regolari. #| #| Disegna un quadrato di lato 10 |# (begin (draw (turn (draw (turn (draw (turn (draw (turn 4 10) 90) 10) 90) 10) 90) 10) 90)) Disegna un triangolo equilatero di lato 15 |# (begin (draw 15) (turn 120) (draw 15) (turn 120) (draw 15) (turn 120)) EasyScheme versione 2.0 Questa seconda versione di EasyScheme estende la prima versione con la capacità di riconoscere e valutare il costrutto repeat. Questo costrutto permette di scrivere programmi in modo compatto. Descrizione 4 (EasyScheme 2.0). EasyScheme 2.0 è in grado di riconoscere e valutare: • EasyScheme versione 1.0 • la ripetizione di espressioni (repeat n espressione . . . ) n:integer? – ripete la sequenza di espressioni (dal secondo all’ultimo argomento) per n volte – la valutazione di repeat coincide con la valutazione dell’ultima espressione valutata Esempio 2 (EasyScheme 2.0). Espressioni che disegnano alcuni poligoni regolari. #| #| Disegna un quadrato di lato 10 |# (repeat 4 (draw 10) (turn 90)) 5 Disegna un triangolo equilatero di lato 15 |# (repeat 3 (draw 15) (turn 120)) EasyScheme versione 3.0 Questa terza versione di EasyScheme estende la seconda versione con la capacità di riconoscere e valutare le variabile (parametri). Descrizione 5 (EasyScheme 3.0). EasyScheme 3.0 è in grado di riconoscere e valutare: • EasyScheme versione 2.0 • le variabili (define variabile espressione) – definisce una variabile associandoci il valore ottenuto dalla valutazione dell’espressione Esempio 3 (EasyScheme 3.0). Espressioni che disegnano alcuni poligoni regolari. #| #| Disegna un quadrato di lato 10 |# (define n 4) ; numero di lati del poligono regolare (define l 10) ; lunghezza dei lati (define g 90) ; angolo di curvatura della tartaruga (repeat n (draw l) (turn g)) Disegna un triangolo equilatero di lato 15 |# (define n 3) ; numero di lati del poligono regolare (define l 15) ; lunghezza dei lati (define g 120) ; angolo di curvatura della tartaruga (repeat n (draw l) (turn g)) 6 EasyScheme versione 4.0 Questa quarta versione di EasyScheme estende la terza versione con la capacità di riconoscere e valutare semplici espressione algebriche. Descrizione 6 (EasyScheme 4.0). EasyScheme 4.0 è in grado di riconoscere e valuare: • EasyScheme versione 3.0 • le espressioni algebriche (+, -, *, /, . . . ) Esempio 4 (EasyScheme 4.0). Espressioni che disegnano dei poligoni regolari. #| #| Disegna un quadrato di lato 10 |# (define n 4) (define l 10) (define alpha (/ (* 180 (- n 2)) n)) ; angolo interno (define g (- 180 alpha)) (repeat n (draw l) (turn g)) 7 Disegna un triangolo equilatero di lato 15 |# (define n 3) (define l 15) (define alpha (/ (* 180 (- n 2)) n)) ; angolo interno (define g (- 180 alpha)) (repeat n (draw l) (turn g)) Scheme versione 5.0 Questa quinta versione di EasyScheme estende la quarta versione con la capacità di estendere il linguaggio definendo delle nuove funzioni. Descrizione 7 (EasyScheme 5.0). EasyScheme 5.0 è in grado di riconoscere e valutare: • EasyScheme versione 4.0 • nuove funzioni (define variabile (lambda (parametro . . . ) espressione . . . )) – definisce una variabile associandoci la funzione definita dall’espressione lambda Esempio 5 (EasyScheme 5.0). Espressione che definisce una funzione che disegna dei poligoni regolari. #| funzione che disegna un poligono regolare con n lati di lunghezza l |# (define poligono-regolare (lambda (n l) (repeat n (draw l) (turn (- 180 (/ (* 180 (- n 2)) n)))))) Esempio 6 (EasyScheme 5.0). Espressioni che disegnano dei poligoni regolari. #| #| Disegna un quadrato di lato 10 |# (poligono-regolare 4 10) Disegna un triangolo equilatero di lato 15 |# (poligono-regolare 3 15) Riferimenti bibliografici [1] Drracket. Available from: http://http://racket-lang.org/. [2] Turtle in drracket. Available from: http://docs.racket-lang.org/turtles/Traditional_Turtles.html. [3] Wikipedia. Drracket. Available from: http://en.wikipedia.org/wiki/DrRacket. [4] Wikipedia. Scheme. Available from: http://it.wikipedia.org/wiki/Scheme.