Ferramentas de Utilizador

Ferramentas de Site


ocaml

Diferenças

Esta página mostra as diferenças entre as duas revisões da página.

Ligação para esta vista de comparação

Ambos os lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
ocaml [2006/03/30 17:36]
marcus
ocaml [2010/01/18 15:45] (Actual)
Linha 45: Linha 45:
  
 ====== Material ====== ====== Material ======
 +
 ===== Sintaxe abstrata do IMP ===== ===== Sintaxe abstrata do IMP =====
-<​code>​+<​code ​ocaml>
 (* categoria sintatica Num *) (* categoria sintatica Num *)
 type num = int;; type num = int;;
  
-(* categoria sintatica ​Loc *) +(* categoria sintatica ​Ident *) 
-type loc = string;;+type ident = string;;
  
 (* categoria sintatica Bool: usamos bool *) (* categoria sintatica Bool: usamos bool *)
  
 (* categoria sintatica AExpr *) (* categoria sintatica AExpr *)
-type aExpr =   Num of num | Loc of loc+type aExpr =   Num of num | Ident of ident
              | Sum of aExpr * aExpr               | Sum of aExpr * aExpr 
              | Diff of aExpr * aExpr              | Diff of aExpr * aExpr
Linha 70: Linha 71:
 (* categoria sintatica Com *) (* categoria sintatica Com *)
 type com =   Skip type com =   Skip
-             | Assign of loc * aExpr+             | Assign of ident * aExpr
              | Seq of com * com              | Seq of com * com
              | Cond of bExpr * com * com              | Cond of bExpr * com * com
Linha 78: Linha 79:
  
 ===== Estados ===== ===== Estados =====
-<​code>​ +<​code ​ocaml
-(* o estado: uma função das locais ​para números inteiros *) +(* o estado: uma função das identificadores ​para números inteiros *) 
-type sigma = loc -> num;;+type sigma = ident -> num;;
  
 (* o estado inicial *) (* o estado inicial *)
Linha 90: Linha 91:
  
 ===== Avaliação de expressões aritméticas ===== ===== Avaliação de expressões aritméticas =====
-<​code>​+<​code ​ocaml>
 (* avaliação das expressões aritméticas *) (* avaliação das expressões aritméticas *)
 let rec eval_aExpr (a,sigma) = let rec eval_aExpr (a,sigma) =
   match a with    match a with 
     Num n -> n     Num n -> n
-  | Loc l -> sigma l+  | Ident x -> sigma x
   | Sum (a1,a2) -> (eval_aExpr (a1,​sigma))+(eval_aExpr (a2,sigma))   | Sum (a1,a2) -> (eval_aExpr (a1,​sigma))+(eval_aExpr (a2,sigma))
   | Diff (a1,a2) -> (eval_aExpr (a1,​sigma))-(eval_aExpr (a2,sigma))   | Diff (a1,a2) -> (eval_aExpr (a1,​sigma))-(eval_aExpr (a2,sigma))
Linha 101: Linha 102:
 ;; ;;
 </​code>​ </​code>​
- 
-===== Exercício 3.5: SON de IMP em OCaml ===== 
- 
-<​code>​ 
-(* avaliação das expressões booleanas *) 
-let rec eval_bExpr (b,sigma) = 
-  match b with 
-    Bool b -> b 
-  | Eq (a1,a2) -> (eval_aExpr (a1,sigma)) = (eval_aExpr (a2,sigma)) 
-  | Lt (a1,a2) -> (eval_aExpr (a1,sigma)) < (eval_aExpr (a2,sigma)) 
-  | Not b -> not (eval_bExpr (b,sigma)) 
-  | And (b1,b2) -> eval_bExpr(b1,​sigma) && eval_bExpr(b2,​sigma) 
-  | Or (b1,b2) -> eval_bExpr(b1,​sigma) || eval_bExpr(b2,​sigma) 
-;; 
- 
-(* avaliação das comandos: semântica operacional natural *) 
-let rec eval_com_nat = function 
-    (Skip,​sigma) -> sigma 
-  | (Assign (l,​a),​sigma) -> mapsto sigma l (eval_aExpr (a,sigma)) 
-  | (Seq (c1,​c2),​sigma) -> eval_com_nat(c2,​eval_com_nat(c1,​sigma)) 
-  | (Cond(b,​c1,​c2),​sigma) -> if ( eval_bExpr (b,sigma)) then eval_com_nat(c1,​sigma) else eval_com_nat(c2,​sigma) 
-  | (While(b,​c1) as w, sigma) -> if (eval_bExpr(b,​sigma)) then eval_com_nat(Seq(c1,​w),​sigma) else sigma 
-  | (_, sigma) -> raise SemValor; 
-;; 
- 
-(* Exemplo *) 
-let programa = Seq(Assign("​n",​Num 1),​Seq(Assign("​x",​Num 1),​While(Lt(Loc "​n",​Num 10),​Seq(Assign("​x",​Prod(Loc "​x",​Loc "​n"​)),​Assign("​n",​Sum(Loc "​n",​ Num 1))))));; 
- 
-let estado_final = eval_com_nat(programa,​empty);;​ 
- 
-# estado_final "​x";;​ 
-- : num = 362880 
-# estado_final "​n";;​ 
-- : num = 10 
- 
-</​code>​ 
- 
- 
ocaml.1143751014.txt.gz · Esta página foi modificada pela última vez em: 2010/01/18 15:45 (Edição externa)