Java. Linguaggi di Programmazione Linguaggi Speciali & Tecnologie dei Linguaggi di Programmazione: Scritto del 30 Giugno 2006



Documenti analoghi
COMPITO DI LABORATORIO DI PROGRAMMAZIONE Luglio Soluzione degli Esercizi

Corso Linguaggi di programmazione II - Unina Esercitazione (prova intercorso)

Algoritmi di Ricerca. Esempi di programmi Java

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 21 Dicembre 2006

Programmazione ad Oggetti Modulo A (Esame del 11/9/2015)

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

Studente (Cognome Nome): Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Primo scritto 11 Gennaio 2008

SAPIENZA Università di Roma, Facoltà di Ingegneria

Esercizi della lezione 5 di Java

Programmazione 1 A.A. 2015/2016

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

La gestione dell input/output da tastiera La gestione dell input/output da file La gestione delle eccezioni

Definizione di classi con array di oggetti

10 - Programmare con gli Array

Arduino: Programmazione

Corso di Laurea in Ingegneria Gestionale Esame di Informatica - a.a luglio 2013

Ottava Esercitazione. introduzione ai thread java mutua esclusione

La selezione binaria

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a giugno 2013

QUEUE : considerazioni. QUEUE : considerazioni. QUEUE : esempio. QUEUE : esempio

Corso di Informatica Corso di Laurea in Ingegneria Gestionale a.a Secondo Compitino 17 Dicembre 2005

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a settembre 2011

Concetti Base Eccezioni Eccezioni e Metodi Gerarchia di Eccezioni. Java: Eccezioni. Damiano Macedonio

Il software e la programmazione

Corso di Laurea in Ingegneria Gestionale Esame di Informatica a.a I scritto Febbraio 11 Febbraio 2011

Progetto Automi e Linguaggi Parser svliluppato con JLex e cup

ESERCIZIO 1 (Definizione funzioni passaggio parametri per copia)

Realizzazione di una classe con un associazione

3. La sintassi di Java

Un esercizio d esame. Flavio De Paoli

Le variabili. Olga Scotti

Oggetti Lezione 3. aspetti generali e definizione di classi I

Main System Monitor Keyboard

Soluzioni degli esercizi di riepilogo (Fondamenti di Informatica 1 Walter Didimo)

Esercizi Capitolo 6 - Alberi binari di ricerca

I file di dati. Unità didattica D1 1

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

ARRAY BIDIMENSIONALI float [][] mx = new float[3][4]; (float []) [] mx = new float[3][4];

GESTIONE INFORMATICA DEI DATI AZIENDALI

Programmazione I / Informatica generale Prova scritta 11 Giugno 2008

ISI s.r.l. Corso di Access 05 CREARE UN ELENCO MAILING ED INVIARE MESSAGGI DI POSTA ELETTRONICA Pag. 1/6

Esercitazione 6. Tutor: Ing. Diego Rughetti. Anno Accademico 2007/2008

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 2

ELEMENTI DI PROGETTAZIONE SOFTWARE

Lab 11 Gestione file di testo"

Java Virtual Machine

Tipicamente un elaboratore è capace di trattare domini di dati di tipi primitivi

Descrizione di un algoritmo

Introduzione ai tipi di dato astratti: applicazione alle liste

Visual Basic.NET La Gestione degli Errori di Federico BARBATI

Politecnico di Milano. Ingegneria del Software a.a. 2006/07. Appello del 14 settembre 2007 Cognome Nome Matricola

Laboratorio di Informatica Lezione 2

Programmazione ad Oggetti: JAVA. Esercitazione

Procedure memorizzate SQL-2003/PSM. Forma base di PSM. Parametri in PSM

Libreria standard Java possiede un enorme libreria di classi standard organizzata in vari package che raccolgono le classi secondo un organizzazione

Esercizi sulla definizione di classi (Fondamenti di Informatica 1 Walter Didimo) Soluzioni

Esercitazione n 4. Obiettivi

Corso di Tecniche di Programmazione

Semantica dei programmi. La semantica dei programmi è la caratterizzazione matematica dei possibili comportamenti di un programma.

DAL DIAGRAMMA AL CODICE

Java:Struttura di Programma. Fabio Scanu a.s. 2014/2015

Progetto Lauree Scientifiche Liceo Classico L.Ariosto, Ferrara Dipartimento di Matematica Università di Ferrara 24 Gennaio 2012

RICORSIVITA. Vediamo come si programma la soluzione ricorsiva al problema precedente: Poniamo S 1 =1 S 2 =1+2 S 3 =1+2+3

Elementi di semantica operazionale

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

Corso sul linguaggio Java

Test di unità con JUnit4

SAPIENZA Università di Roma Facoltà di Ingegneria dell Informazione, Informatica e Statistica

Funzioni in C. Violetta Lonati

Reflection in Java. Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A

Fondamenti dell Informatica Ricorsione e Iterazione Simona Ronchi Della Rocca (dal testo: Kfoury, Moll and Arbib, cap.5.2)

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A Esercitazione. Programmazione Object Oriented in Java

Parcheggio.rtf 1/8 6 gennaio Prova di programmazione: parcheggio a pagamento

OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C

Utilizzo del linguaggio Basic utilizzando l interfaccia di Excel Silvia Patacchini

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

Le stringhe. Le stringhe

Gestione di errori e situazioni eccezionali. Gestione delle eccezioni. Gestione tradizionale di errori e situazioni eccezionali (2)

ABC16. 5 Indica nelle reti ethernet cosa è una collisione e come viene gestita. 6 Disegna lo schema della macchina di VON NEUMANN

Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Prova d Esame Compito B

Introduzione a Visual Basic Lezione 1 Concetti base e istruzioni condizionali

public static boolean occorre (int[] a, int n) { int i = 0; boolean trovato = false;

Gestione delle Eccezioni

I file WAR. Laboratorio di Tecnologie Lato Server - V.Della Mea e I.Scagnetto, a.a. 2004/05-1

19. Introduzione al multi-threading

Politecnico di Torino

Due algoritmi di ordinamento. basati sulla tecnica Divide et Impera: Mergesort e Quicksort

Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio

2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso

Codifica: dal diagramma a blocchi al linguaggio C++

Prossime lezioni. Dai TDA agli oggetti. Riassunto. Riassunto TDA. Oggi. Stefano Mizzaro 1

1238 1*8 2 +2*8 1 +3*8 0

Transcript:

Linguaggi di Programmazione Linguaggi Speciali & Tecnologie dei Linguaggi di Programmazione: Scritto del 30 Giugno 2006 Java Nome e Cognome: Matricola: Corso di Laurea: Date le classi seguenti: class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; public static Point[] makearray(int n, Point p1, Point p2) { Point[] res = new Point[n]; boolean flag = true; for (int i = 0; i < n; i++) { res[i] = flag? p1 : p2; flag =!flag; return res; public static Point sum(point[] a) { Point res = a[0]; for(int i = 1; i < a.length; i++) { res.x = res.x + a[i].y; res.x = res.x + a[i].x; return res; Dopo l esecuzione di: Point pt1 = new Point(1,2); Point pt2 = new Point(2,4); Point pt3 = Point.sum(Point.makeArray(3, pt1, pt2)); 1. Quanto vale pt1.x? 2. Quanto vale pt1.y? 3. Quanto vale pt2.x? 4. Quanto vale pt2.y? 5. Quanto vale pt3.x? 6. Quanto vale pt3.y? Date le classi seguenti: 1

class A { String method(b a, A b) { return "a"; class B extends A { String method(a a, B b) { return "b"; String method(b a, B b) { return "c"; e gli oggetti seguenti: A a = new A(); B b = new B(); A c = new B(); 7. Quanto vale a.method(a, a)? (a) "a" (b) "b" (c) "c" (d) Errore NoSuchMethod (e) Errore Ambiguous 8. Quanto vale b.method(b, b)? (a) "a" (b) "b" (c) "c" (d) Errore NoSuchMethod (e) Errore Ambiguous 9. Quanto vale c.method(c, c)? (a) "a" (b) "b" (c) "c" (d) Errore NoSuchMethod (e) Errore Ambiguous 10. Quanto vale b.method(b, c)? (a) (b) (c) (d) (e) "a" "b" "c" Errore NoSuchMethod Errore Ambiguous 2

11. Dato un array bidimensionale a di stringhe, il suo contorno è composto dalle caselle a[i][j] dove il valore di i o j è quello minimo o quello massimo rispetto alla loro dimensione. Una copertura di a è un array monodimensionale b di stringhe tale che il contorno di a è contenuto in b, ovvero ogni elemento del contorno di a compare in b. Definire un metodo pubblico statico unique che verifica che un array monodimensionale di stringhe è composto di valori unici, ovvero ogni valore compare una volta sola nell array. Definire un metodo minimalcover che prende un array bidimensionale a di stringhe e un array monodimensionale b di stringhe e verifica che b è una copertura di lunghezza minima di a. Per esempio, minimalcover(new String[][] { {"verde", "verde", "verde", "verde", {"bianco", "blue", "bianco", { "rosso", new String[] {"verde", "bianco", "rosso") restituisce true. 3

12. Sia Combinator la rappresentazione di un piccolo linguaggio di combinatori Turing completo. Questo linguaggio è composto di due combinatori S e K e dell applicazione di una funzione a un argomento. abstract class Combinator { class S extends Combinator { S () { class K extends Combinator { K () { 4

class Apply extends Combinator { Combinator fun; Combinator arg; Apply (Combinator fun, Combinator arg) { this.fun = fun; this.arg = arg; Per simulare l applicazione con più di un argomento si combina l applicazione. Per esempio, il termine S K (K S) K che rappresenta l applicazione di S ai tre argomenti K, (K S) e K, ed il termine K S S che rappresenta l applicazione di K ai due argomenti S e S si definiscono come: Combinator c1 = new Apply(new Apply(new Apply(new S(), new K()), new Apply(new K(), new S())), new K()); Combinator c2 = new Apply(new Apply(new K(), new S()), new S()); Ci sono due regole di riduzione, una per ogni combinatore. Dati due termini x e y qualsiasi, K x y si riduce in x. Dati tre termini x, y e z qualsiasi, S x y z si riduce in x z (y z). La valutazione si effettua in modo non deterministico iterando l applicazione delle regole di riduzione all interno del termine. Per esempio, c1 si valuta in K. Una possibile sequenza di riduzioni è la seguente: S K (K S) K K K (K S K) K K S K. Aggiungere in Combinator: - un metodo pubblico iss che indica se un oggetto di tipo Combinator è un S. Per esempio, new S().isS() restituisce true. - un metodo pubblico isk che indica se un oggetto di tipo Combinator è un K. Per esempio, new K().isK() restituisce true. - un metodo pubblico isapp che indica se un oggetto di tipo Combinator è un Apply. Per esempio, c1.isapp() restituisce true. - un metodo pubblico numberofs che ritorna il numero di combinatori S dentro un termine. Per esempio, c1.numberofs() restituisce 2. - un metodo pubblico equals che fa un test di uguaglianza strutturale con un oggetto o di tipo Object. Per esempio, c1.equals("true") restituisce false, invece new S().equals(new S()) restituisce true. - un metodo pubblico gethead che ritorna il combinatore di testa di un applicazione con argomenti multipli. Per esempio, c1.gethead().iss() restituisce true. - un metodo pubblico numberofargs che ritorna il numero di argomenti di un applicazione. Per esempio, c1.numberofargs() restituisce 3 e c2.numberofargs() restituisce 2. - un metodo pubblico isreds che indica se la regola di riduzione per S è applicabile sulla radice di un termine. Per esempio, c1.isreds() restituisce true. - un metodo pubblico isredk che indica se la regola di riduzione per K è applicabile sulla radice di un termine. Per esempio, c2.isredk() restituisce true. - un metodo pubblico reduce che prova ad applicare una riduzione all interno di un termine. Se tale riduzione non è possibile solleva l eccezione NothingToDoException. Per esempio, c2.reduce().iss() restituisce true. 5

- un metodo pubblico eval che itera la riduzione all interno di un termine fino ad esaurimento. Per esempio, c1.eval().isk() restituisce true. 6

7

Esterel 13. Scrivere un programma che gestisce il centralino delle docce di una piscina comunale. Il centralino gestisce l apertura e la chiusura di due docce (OPEN1, OPEN2 e CLOSE1, CLOSE2). All inizio, le due docce non sono in funzione. Sul centralino ci sono due pulsanti con una lampadina che indicano lo stato delle docce. Il programma può accendere la lampadina (LIGHT1_ON o LIGHT2_ON) o spengerla (LIGHT1_OFF o LIGHT1_OFF). Per mettere in funzione una doccia, l utente deve introdurre una carta magnetica (ENTER) e premere sul pulsante corrispondente (BUTTON1 o BUTTON1). Quando la doccia è libera, il centralino carica il costo della doccia sulla carta (DEBIT) e mette in funzione la doccia corrispondente (OPEN1 o OPEN2) e accende la lampadina corrispondente (LIGHT1_ON o LIGHT2_ON). La doccia funziona per 3 minuti (SECOND) prima di fermarsi (CLOSE1 e LIGHT1_OFF o CLOSE2 e LIGHT2_OFF). Premere su una doccia già occupata fa emettere un segnale sonoro (BEEP). Lasciare una carta inserita per più di un minuto (SECOND) fa emettere un segnale sonoro (BEEP) ogni due secondi (SECOND) fino a quando la carta è ritirata (EXIT). Le dichiarazioni dei segnali sono le seguenti: module SHOWER: input SECOND, ENTER, EXIT, BUTTON1, BUTTON2; relation SECOND # ENTER # EXIT # BUTTON1 # BUTTON2; output BEEP, DEBIT, OPEN1, OPEN2, CLOSE1, CLOSE2, LIGHT1_ON, LIGHT2_ON, LIGHT1_OFF, LIGHT2_OFF;... end module 8

Risposte dello scritto del 30 Giugno 2006 Java Date le classi seguenti: class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; public static Point[] makearray(int n, Point p1, Point p2) { Point[] res = new Point[n]; boolean flag = true; for (int i = 0; i < n; i++) { res[i] = flag? p1 : p2; flag =!flag; return res; public static Point sum(point[] a) { Point res = a[0]; for(int i = 1; i < a.length; i++) { res.x = res.x + a[i].y; res.x = res.x + a[i].x; return res; Dopo l esecuzione di: Point pt1 = new Point(1,2); Point pt2 = new Point(2,4); Point pt3 = Point.sum(Point.makeArray(3, pt1, pt2)); 1. Quanto vale pt1.x? 18 2. Quanto vale pt1.y? 2 3. Quanto vale pt2.x? 2 4. Quanto vale pt2.y? 4 5. Quanto vale pt3.x? 18 1

6. Quanto vale pt3.y? 2 Date le classi seguenti: class A { String method(b a, A b) { return "a"; class B extends A { String method(a a, B b) { return "b"; String method(b a, B b) { return "c"; e gli oggetti seguenti: A a = new A(); B b = new B(); A c = new B(); 7. Quanto vale a.method(a, a)? (a) "a" (b) "b" (c) "c" (d) Errore NoSuchMethod (e) Errore Ambiguous 8. Quanto vale b.method(b, b)? (a) "a" (b) "b" (c) "c" (d) Errore NoSuchMethod (e) Errore Ambiguous 9. Quanto vale c.method(c, c)? (a) (b) (c) (d) (e) "a" "b" "c" Errore NoSuchMethod Errore Ambiguous 2

10. Quanto vale b.method(b, c)? (a) (b) (c) (d) (e) "a" "b" "c" Errore NoSuchMethod Errore Ambiguous 11. Dato un array bidimensionale a di stringhe, il suo contorno è composto dalle caselle a[i][j] dove il valore di i o j è quello minimo o quello massimo rispetto alla loro dimensione. Una copertura di a è un array monodimensionale b di stringhe tale che il contorno di a è contenuto in b, ovvero ogni elemento del contorno di a compare in b. Definire un metodo pubblico statico unique che verifica che un array monodimensionale di stringhe è composto di valori unici, ovvero ogni valore compare una volta sola nell array. Definire un metodo minimalcover che prende un array bidimensionale a di stringhe e un array monodimensionale b di stringhe e verifica che b è una copertura di lunghezza minima di a. Per esempio, minimalcover(new String[][] { {"verde", "verde", "verde", "verde", {"bianco", "blue", "bianco", { "rosso", new String[] {"verde", "bianco", "rosso") restituisce true. public static boolean in(string s, int n, String[] a) { for(int i = n; i < a.length; i++) { if (s.equals(a[i])) { public static boolean in(string s, String[] a) { return in(s, 0, a); public static boolean in(string[] a, String[] b) { for (int i = 0; i < a.length; i++) { if (!in(a[i], b)) { public static boolean unique(string[] a) { for(int i = 0; i < a.length - 1; i++) { if (in(a[i], i + 1, a)) { 3

public static boolean inborder(string s, String[][] a) { if (a.length == 0) { if (in(s, a[0]) in(s, a[a.length -1])) { for(int i = 1; i < a.length - 1; i++) { if (a[i].length!=0 && (s.equals(a[i][0]) s.equals(a[i][a[i].length -1]))) { public static boolean inborder(string a[], String[][] b) { for(int i = 0; i < a.length; i++) { if (!(inborder(a[i], b))) { public static boolean cover(string[] c, String[][] a) { if (a.length == 0) { if (!(in(a[0], c) && in(a[a.length -1], c))) { for(int i = 1; i < a.length - 1; i++) { if (a[i].length!= 0 &&!(in(a[i][0], c) && in(a[i][a[i].length -1], c))){ public static boolean minimalcover(string[][] a, String[] c) { return (unique(c) && inborder(c,a) && cover(c,a)); 12. Sia Combinator la rappresentazione di un piccolo linguaggio di combinatori Turing completo. Questo linguaggio è composto di due combinatori S e K e dell applicazione di una funzione a un argomento. abstract class Combinator { 4

class S extends Combinator { S () { class K extends Combinator { K () { class Apply extends Combinator { Combinator fun; Combinator arg; Apply (Combinator fun, Combinator arg) { this.fun = fun; this.arg = arg; Per simulare l applicazione con più di un argomento si combina l applicazione. Per esempio, il termine S K (K S) K che rappresenta l applicazione di S ai tre argomenti K, (K S) e K, ed il termine K S S che rappresenta l applicazione di K ai due argomenti S e S si definiscono come: Combinator c1 = new Apply(new Apply(new Apply(new S(), new K()), new Apply(new K(), new S())), new K()); Combinator c2 = new Apply(new Apply(new K(), new S()), new S()); Ci sono due regole di riduzione, una per ogni combinatore. Dati due termini x e y qualsiasi, K x y si riduce in x. Dati tre termini x, y e z qualsiasi, S x y z si riduce in x z (y z). La valutazione si effettua in modo non deterministico iterando l applicazione delle regole di riduzione all interno del termine. Per esempio, c1 si valuta in K. Una possibile sequenza di riduzioni è la seguente: S K (K S) K K K (K S K) K K S K. Aggiungere in Combinator: - un metodo pubblico iss che indica se un oggetto di tipo Combinator è un S. Per esempio, new S().isS() restituisce true. - un metodo pubblico isk che indica se un oggetto di tipo Combinator è un K. Per esempio, new K().isK() restituisce true. - un metodo pubblico isapp che indica se un oggetto di tipo Combinator è un Apply. Per esempio, c1.isapp() restituisce true. - un metodo pubblico numberofs che ritorna il numero di combinatori S dentro un termine. Per esempio, c1.numberofs() restituisce 2. - un metodo pubblico equals che fa un test di uguaglianza strutturale con un oggetto o di tipo Object. Per esempio, c1.equals("true") restituisce false, invece new S().equals(new S()) restituisce true. - un metodo pubblico gethead che ritorna il combinatore di testa di un applicazione con argomenti multipli. Per esempio, c1.gethead().iss() restituisce true. - un metodo pubblico numberofargs che ritorna il numero di argomenti di un applicazione. Per esempio, c1.numberofargs() restituisce 3 e c2.numberofargs() restituisce 2. 5

- un metodo pubblico isreds che indica se la regola di riduzione per S è applicabile sulla radice di un termine. Per esempio, c1.isreds() restituisce true. - un metodo pubblico isredk che indica se la regola di riduzione per K è applicabile sulla radice di un termine. Per esempio, c2.isredk() restituisce true. - un metodo pubblico reduce che prova ad applicare una riduzione all interno di un termine. Se tale riduzione non è possibile solleva l eccezione NothingToDoException. Per esempio, c2.reduce().iss() restituisce true. - un metodo pubblico eval che itera la riduzione all interno di un termine fino ad esaurimento. Per esempio, c1.eval().isk() restituisce true. class NothingToDoException extends Exception { abstract class Combinator { public boolean iss() { public boolean isk() { public boolean isapp() { public abstract int numberofs(); public abstract boolean equals(object o); public Combinator gethead() { return this; public int numberofargs() { return 0; public boolean isredk() { return (gethead().isk() && numberofargs() == 2); public boolean isreds() { return (gethead().iss() && numberofargs() == 3); public Combinator reducetop() { return this; public Combinator reduce() throws NothingToDoException { Combinator res = reducetop(); if (this.equals(res)) { throw new NothingToDoException(); return res; public Combinator eval() { Combinator res = this, next; while (true) { System.out.println(res); 6

next = res.reducetop(); if (next.equals(res)) { return res; res = next; class S extends Combinator { S() { public boolean iss() { public int numberofs() { return 1; public boolean equals(object o) { return (o instanceof S); class K extends Combinator { K() { public boolean isk() { public int numberofs() { return 0; public boolean equals(object o) { return (o instanceof K); class Apply extends Combinator { Combinator fun; Combinator arg; Apply(Combinator fun, Combinator arg) { this.fun = fun; this.arg = arg; public boolean isapp() { public int numberofs() { return fun.numberofs() + arg.numberofs(); public boolean equals(object o) { if (!(o instanceof S)) { 7

Apply app = (Apply) o; return (fun.equals(app.fun) && arg.equals(app.arg)); public Combinator gethead() { return fun.gethead(); public int numberofargs() { return fun.numberofargs() + 1; public Combinator reducetop() { if (isredk()) { return ((Apply) fun).arg; if (isreds()) { Apply app1 = (Apply) fun; Apply app2 = (Apply) app1.fun; return new Apply(new Apply(app2.arg, arg), new Apply(app1.arg, arg)); Combinator res1 = fun.reducetop(); if (fun.equals(res1)) { return (new Apply(fun, arg.reducetop())); return new Apply(res1, arg); Esterel 13. Scrivere un programma che gestisce il centralino delle docce di una piscina comunale. Il centralino gestisce l apertura e la chiusura di due docce (OPEN1, OPEN2 e CLOSE1, CLOSE2). All inizio, le due docce non sono in funzione. Sul centralino ci sono due pulsanti con una lampadina che indicano lo stato delle docce. Il programma può accendere la lampadina (LIGHT1_ON o LIGHT2_ON) o spengerla (LIGHT1_OFF o LIGHT1_OFF). Per mettere in funzione una doccia, l utente deve introdurre una carta magnetica (ENTER) e premere sul pulsante corrispondente (BUTTON1 o BUTTON1). Quando la doccia è libera, il centralino carica il costo della doccia sulla carta (DEBIT) e mette in funzione la doccia corrispondente (OPEN1 o OPEN2) e accende la lampadina corrispondente (LIGHT1_ON o LIGHT2_ON). La doccia funziona per 3 minuti (SECOND) prima di fermarsi (CLOSE1 e LIGHT1_OFF o CLOSE2 e LIGHT2_OFF). Premere su una doccia già occupata fa emettere un segnale sonoro (BEEP). Lasciare una carta inserita per più di un minuto (SECOND) fa emettere un segnale sonoro (BEEP) ogni due secondi (SECOND) fino a quando la carta è ritirata (EXIT). Le dichiarazioni dei segnali sono le seguenti: module SHOWER: input SECOND, ENTER, EXIT, BUTTON1, BUTTON2; relation SECOND # ENTER # EXIT # BUTTON1 # BUTTON2; 8

output BEEP, DEBIT, OPEN1, OPEN2, CLOSE1, CLOSE2, LIGHT1_ON, LIGHT2_ON, LIGHT1_OFF, LIGHT2_OFF;... end module module SHOWER: input SECOND, ENTER, EXIT, BUTTON1, BUTTON2; relation SECOND # ENTER # EXIT # BUTTON1 # BUTTON2; output BEEP, DEBIT, OPEN1, OPEN2, CLOSE1, CLOSE2, LIGHT1_ON, LIGHT2_ON, LIGHT1_OFF, LIGHT2_OFF; signal SHOW1, SHOW2, RUN1, RUN2 in loop await RUN1; emit OPEN1; emit LIGHT1_ON; emit DEBIT; await SECOND; abort sustain SHOW1; when 179 SECOND; emit LIGHT2_ON; emit CLOSE2; end loop loop await RUN2; emit OPEN2; emit LIGHT2_ON; emit DEBIT; await SECOND; abort sustain SHOW2; when 179 SECOND; emit LIGHT2_ON; emit CLOSE2; end loop loop await ENTER; abort every BUTTON1 do present SHOW1 then emit BEEP else emit RUN1 end present end every every BUTTON2 do present SHOW2 then emit BEEP else emit RUN2 end present end every 9

await 60 SECOND; every 2 SECOND do emit BEEP end every when EXIT end loop end signal end module 10