(* ESEMPIO: Calcolo dell'n-esimo numero di Fibonacci (n>=1) f_0 = 0 f_1 = 1 f_n = f_h + f_k con n>=2, k=n-1, h=n-2 *) (* SINTASSI C { int f_i = 1; int f_i_meno_1 = 0; int i = 1; while (i < N) {int temp = f_i; f_i = f_i + f_i_meno_1; f_i_meno_1 = temp; i = i+1;} RISULTATO = f_i; } *) (* Rappresentazione del programma come valore del tipo prog di CAML *) let fib = Prog([Var_init("f_i", Num 1);Var_init("f_i_meno_1", Num 0); Var_init("i", Num 1)], [ While(BinExp(Ide "i", Lt, Ide "N")), Block([Var("temp")], [Assign("temp", Ide "f_i"); Assign("f_i", BinExp(Ide "f_i", Add, Ide "f_i_meno_1")); Assign("f_i_meno_1", Ide "temp"); Assign("i", BinExp(Ide "i", Add, Num 1))])); Assign("RISULTATO", Ide "f_i")]);; (* SEMANTICA DI UN PROGRAMMA CON STATO INIZIALE *) let semprog2 p a m = match p with Prog(dl,cl) -> semc (Block(dl,cl)) a m;; (* stato iniziale con variabili A, B e RISULTATO *) let (a1,m1) = semdl [Var_init("N",Num 10); Var("RISULTATO");] (omega::[]) (omega::[]);; (* Esecuzione del programma mcd a partire dallo stato iniziale (a1,m1) *) let m_ris = semprog2 fib a1 m1;; (* Verifica dei valori delle variabili A, B, RISULTATO *) semexp (Ide "N") a1 m_ris;; semexp (Ide "RISULTATO") a1 m_ris;;