L'albero e le Tartarughe

Ricordiamo che un albero è costituito da:

  1. -un ceppo
  2. -due sottoalberi (della stessa struttura dell'albero).
Usiamo lo StarLogo con i patch di ampiezza 1 per trascrivere in un programma la definizione appena data e dunque la solita convenzione sui colori. Inizieremo usando una sola tartaruga ma lo scopo è quello di giungere ad una soluzione "decentralizzata" e dunque di usare le tartarughe in parallelo.
Nella procedura ramo con :lun abbiamo indicato la lunghezza dei rami e con :ricorsione la profondità della ricorsione medesima.


to ramo :ricorsione :lun
if :ricorsione = 0 [stop]
fd :lun
rt 20 ramo :ricorsione - 1 :lun
lt 40 ramo :ricorsione - 1 :lun
rt 20 ;riporta la tarta allo stato iniziale
bk :lun ;riporta la tarta allo stato iniziale
end
 

Le ultime due istruzioni sono di solito una "sorpresa" al primo approccio e sono legate alla questione della "trasparenza dello stato". Nell'ambiente osservatore scriveremo invece


to inizia
ca
crt 1
ask-turtles[pd]
end
 

un alberoEcco la figura che otteniamo dopo gli ordini inizia e ramo 10 15 mentre la velocità di esecuzione è posta a 10, e l'esecuzione fermata forzatamente. Si vede che, per costruzione ricorsiva, l'albero si forma da destra verso sinistra.

Per trascrivere questa situazione nell'ambiente parallelo decidiamo che una tartaruga madre generi due figlie e assegni loro lo stesso suo compito imponendo alla nascita ad una di volgersi a destra e all'altra a sinistra. Dovrà poi rassegnarsi a morire. La prima procedura che scriviamo è dunque

 
to cammina :lun
fd :lun
hatch[rt 20 ]
hatch[lt 20 ]
die
end
 

Dopo il solito inizia, sulla finestra tartarughe scriviamo cammina 15 e assegnamo l'ordine varie volte. Il tutto sembra funzionare!! Ma se proviamo a scrivere un repeat 4[cammina 15] forse ci sorprendiamo. Le tartaghe figlie non eseguono, ovviamente, l'ordine. Per ovviare al problema una prima tecnica è quella di scrivere la procedura ricorsiva

 
to tree :iterazioni :lun
if 0 = :iterazioni [stop]
ask-turtles [cammina :lun ]
tree :iterazioni - 1 :lun
end 
 
nella finestra osservatore. Il tutto funziona perfettamente come si può vedere dalla figura annessa ottenuta con la successione degli ordini inizia, tree 10 15 ma seguendo lo spirito dello StarLogo, cerchiamo un approccio ancora pił "decentralizzato". Allo scopo assegnamo ad ogni tartaruga una "generazione". La corrispondenza con la profondità della ricorsione sarà il livello generazionale. Usiamo due variabili globali finisci e lun che assegnamo tramite slider e scriviamo la seguente procedura
 
turtles-own[generazione]
to newtree  
if generazione > finisci [stop]
set generazione generazione + 1
fd lun
hatch[rt 20 ]
hatch[lt 20 ]
die
end
 
Si aggiunge per la tartaruga un pulsante forever che esegue l'istruzione newtree e ..il nostro albero viene costruito. Si osservi la "naturalezza" dello stile di programmazione. E si osservi nella figura ottenuta un alberocon la procedura fermata in esecuzione come l'albero, a differenza di prima, si formi in modo bilanciato. Questa volta abbiamo giocato un po' con i colori prima di avviare la procedura.
Inoltre, dato che riflettere sugli errori di programmazione èmolto istruttivo, si consiglia l'insegnante che usa queste pagine di chiedere ai propri allievi come mai invece la seguente procedura è scorretta.
 
to newtree  :lun
if generazione > finisci [stop]
fd :lun
hatch[rt 20 ]
hatch[lt 20 ]
set generazione generazione + 1
die
end