Torna alla pagina di Modellazione ed Analisi di Sistemi
:: Modellazione ed Analisi di Sistemi - AsmetaL ::
Ove non meglio specificato, tutti i testi tra virgolette vanno intesi come citazioni letterali dalle slide della prof Riccobene Elvinia Maria, 2010.
AsmetaL è un linguaggio formale che permette di descrivere un sistema che si vuole modellare, a tal fine AsmetaL include:
Abbiamo già visto di quali parti si compone una ASM, rivediamo tali componenti con alcune specifiche relative ad una macchina ASM. Una ASM è una tupla che si compone di: (name, header, body, main rule, initialization).
Esempio: “Si prenda come esempio il sistema orologio, il quale dovrà essere modellato con una ASM”.
Specifiche: quello che devo modellare in questo sistema è il funzionamento di un orologio, dunque ci deve essere un dominio dei secondi, minuti ed ore (che saranno sotto-domini del dominio Integer). Quello che dovrà accadere è che ogni volta che il dominio dei secondi avrà un valore pari a 59 si dovranno incrementare i minuti. Lo stesso per i minuti.
asm Clock
domain Minuto subsetof Integer domain Ors subsetof Integer import ./StandardLibrary
terminata la fase di specifica dei domini ci servirà anche dichiarare delle funzioni. Nel caso la StandardLibrary fosse nella cartella in cui vengono salvati i file .asm la notazione sopra adottata va bene. In caso contrario andrà definito il percorso assoluto dove la StandardLibrary verrà memorizzata. Osservando l'albero delle funzioni ASM possiamo osservare che si sono diversi tipi di funzioni, quelle dichiarate in seguito saranno di tipo controlled, in quanto non dovranno essere passate dall'ambiente esterno, ma saranno gestite totalmente dalla macchina ASM:
controlled secondi: Secondo controlled minuti: Minuto controlled ore: Ora
domain Secondo = {0..59} domain Minuto = {0..59} domain Ora = {0..23}
Quanto definito non ha bisogno di troppe spiegazioni in quanto si è specificato la struttura delle ore, minuti e secondi.
Passiamo a definire le funzioni necessarie, in questo scenario ne definiremo una, la quale avrà il compito di incrementare le ore qualora la condizione imposta fosse soddisfatta:
macro rule r_IncMinOre = par if minuti = 59 then ore := (ore + 1) mod 24 end if minuti := (minuti + 1) mod 60 endpar
Brevemente, nel caso i minuti avessero un valore pari a 59 allora incremento le ore, in caso contrario incremento i minuti.
main rule r_Main= par if secondi = 59 then r_IncMinOre[] endif minuti = (minuti + 1) mod 60 endpar
default init s0: function secondi = 0 function minuti = 0 function ore = 0