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.