====== Links ====== * [[http://caml.inria.fr|Página]] da distribuição de OCaml ====== Referências ======
Uma introdução a OCaml de um dos autores.
(* categoria sintatica Num *)
type num = int;;
(* categoria sintatica Ident *)
type ident = string;;
(* categoria sintatica Bool: usamos bool *)
(* categoria sintatica AExpr *)
type aExpr = Num of num | Ident of ident
| Sum of aExpr * aExpr
| Diff of aExpr * aExpr
| Prod of aExpr * aExpr
;;
(* categoria sintatica BExpr *)
type bExpr = Bool of bool
| Eq of aExpr * aExpr | Lt of aExpr * aExpr
| Not of bExpr
| And of bExpr * bExpr
| Or of bExpr * bExpr
;;
(* categoria sintatica Com *)
type com = Skip
| Assign of ident * aExpr
| Seq of com * com
| Cond of bExpr * com * com
| While of bExpr * com
;;
===== Estados =====
(* o estado: uma função das identificadores para números inteiros *)
type sigma = ident -> num;;
(* o estado inicial *)
let empty : sigma = function x -> 0;;
(* um estado modificado em um ponto: sigma[l -> n] *)
let mapsto f l n a = if a = l then n else f a;;
===== Avaliação de expressões aritméticas =====
(* avaliação das expressões aritméticas *)
let rec eval_aExpr (a,sigma) =
match a with
Num n -> n
| Ident x -> sigma x
| Sum (a1,a2) -> (eval_aExpr (a1,sigma))+(eval_aExpr (a2,sigma))
| Diff (a1,a2) -> (eval_aExpr (a1,sigma))-(eval_aExpr (a2,sigma))
| Prod (a1,a2) -> (eval_aExpr (a1,sigma))*(eval_aExpr (a2,sigma))
;;