Automi e Macchina di Turing
Allo stato attuale delle conoscenze degli alunni si ritiene di saltare la trattazione tramite diagrammi di flusso e per facilitare le cose anche la speudocodifica cercando di proporre del codice facilmente leggibile.
Il programma sarà il seguente.
program Semaforo;
{$APPTYPE CONSOLE}
uses
SysUtils;
var
btermina: boolean;
// Procedura per lo stato di Verde.
procedure Verde();
begin
writeln('Verde');
end;
// Procedura per lo stato di Arancione.
procedure Arancione();
begin
writeln('Arancione');
end;
// Procedura per lo stato di Rosso.
procedure Rosso();
begin
writeln('Rosso');
end;
procedure Timer(iIntervallo: integer);
var
i: integer;
begin
// Simulo un componente timer, per permanere nello stato
// attuale per un dato intervallo di tempo.
//for i := 0 to (iIntervallo * 1000000) do;
sleep(iIntervallo); {intervallo in millisecondi}
end;
begin
btermina := False;
// Ciclo indefinitivamente oppure fino a che non è inserito
// un carattere da tastiera, in modo da non generare un ciclo
// infinito che creerebbe problemi di fermata.
repeat
// Successione di fassi ad intervalli.
Verde;
Timer(1000);
Arancione;
Timer(1000);
Rosso;
Timer(1000);
until btermina;
end.
Come si vede , per facilitare le cose in questa prima versione si è pensato ad un ciclo infinito, comune a tante applicazioni industriali dove l’unico intervento umano è l’accensione/spegnimento della macchina.
Nel ciclo, che è un repeat/until in quanto si prevede che almeno una volta debba essere eseguito (poteva comunque essere un while sempre vero), sono immerse in successione tutte le operazioni che deve fare l’automa. Si stabilisce che all’inizio in semaforo sia verde e la transizione di stato è data dallo scadere dell’intervallo di tempo.
L’intervallo di tempo è stabilito da una procedura che chiede in ingresso il numero di millisecondi di attesa e utilizza la procedura di Pascal Sleep per fare il ritardo. Altrimenti si sarebbe potuto ritardare tramite un ciclo for molto lungo, in questo caso bisognava tramite prove stabilire quanti cicli sono necessari per ritardare di 1 secondo:
for i := 0 to (iIntervallo * 1000000) do;
un ciclo for con corpo nullo, no fa ninete se non aspettare la fine. Questa è modo classico di costruire un ritardo quando non si hanno librerie con procedure e funzioni già utilizzabili.
Lo stato dell’automa è implementato dalla chiamata della procedura che stampa il messaggio opportuno e che simula, in modalità non grafica, il passaggio di colore del semaforo.
Come risultato apparirà la seguente finestra.
Implementazione Pascal
Copyright © 2006 by
Emanuele Scapin
All Rights reserved
Designed by GOEMO.de