(* ESEMPIO: CALCOLO DEL QUOZIENTE E RESTO DELLA DIVISIONE INTERA *) (* SINTASSI C { int q; int r; q = 0; r = A; while (r >= B) { q = q+1; r = r-B; } QUOZIENTE = q; RESTO = r; } *) (* Rappresentazione del programma come valore del tipo prog di CAML *) let quo_rem = Prog([Var("q");Var("r")], [Assign("q", Num 0); Assign("r", Ide "A"); While(BinExp(Ide "r", Gte, Ide "B"), Block([], [Assign("q", BinExp(Ide "q", Add, Num 1)); Assign("r", BinExp(Ide "r", Sub, Ide "B"))])); Assign("QUOZIENTE", Ide "q"); Assign("RESTO", Ide "r")]);; (* 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, QUOZIENTE, RESTO *) let (a1,m1) = semdl [Var_init("A",Num 29); Var_init("B", Num 6); Var("QUOZIENTE"); Var("RESTO")] (omega::[]) (omega::[]);; (* Esecuzione del programma mcd a partire dallo stato iniziale (a1,m1) *) let m_ris = semprog2 quo_rem a1 m1;; (* Verifica dei valori delle variabili A, B, QUOZIENTE, RESTO *) semexp (Ide "A") a1 m_ris;; semexp (Ide "B") a1 m_ris;; semexp (Ide "QUOZIENTE") a1 m_ris;; semexp (Ide "RESTO") a1 m_ris;;