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/08/29 22:35]
marcus
ocaml [2010/01/18 15:45] (Actual)
Linha 47: Linha 47:
  
 ===== Sintaxe abstrata do IMP ===== ===== Sintaxe abstrata do IMP =====
-<​code>​+<​code ​ocaml>
 (* categoria sintatica Num *) (* categoria sintatica Num *)
 type num = int;; type num = int;;
Linha 79: Linha 79:
  
 ===== Estados ===== ===== Estados =====
-<​code>​+<​code ​ocaml>
 (* o estado: uma função das identificadores para números inteiros *) (* o estado: uma função das identificadores para números inteiros *)
 type sigma = ident -> num;; type sigma = ident -> num;;
Linha 91: 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) =
Linha 101: Linha 101:
   | Prod (a1,a2) -> (eval_aExpr (a1,​sigma))*(eval_aExpr (a2,sigma))   | Prod (a1,a2) -> (eval_aExpr (a1,​sigma))*(eval_aExpr (a2,sigma))
 ;; ;;
-</​code>​ 
- 
- 
- 
-===== Exercício 4.2: SOE de IMP em OCaml ===== 
-<​code>​ 
-type estado = Final of sigma | Intermediario of com * sigma;; 
- 
-exception SemSuccessor;;​ 
- 
-(* avaliação dos comandos: semântica operacional estrutural *) 
-let rec eval_one_com_est = function 
-    Final s -> raise SemSuccessor 
-  | Intermediario (Skip,s) -> Final s 
-  | Intermediario (Assign(l,​a),​s) -> Intermediario (Skip,​mapsto s l (eval_aExpr (a,s))) 
-  | Intermediario (Seq(c1,​c2),​s) -> let e = eval_one_com_est (Intermediario (c1,s)) in 
-    begin 
-      match e with 
- Final s' -> Intermediario(c2,​s'​) 
-      | Intermediario(c1',​s'​) -> Intermediario(Seq(c1',​c2),​s'​) 
-    end 
-  | Intermediario (Cond(b,​c1,​c2),​s) -> if eval_bExpr(b,​s) then Intermediario(c1,​s) else Intermediario(c2,​s) 
-  | Intermediario (While (b,c1) as w,s) -> Intermediario(Cond(b,​Seq(c1,​w),​Skip),​s) 
-  | Intermediario (_,s) -> raise SemSuccessor 
-;; 
- 
-let rec eval_com_est e = try e::​(eval_com_est (eval_one_com_est e)) with SemSuccessor -> [e];; 
- 
-(* 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))))));; 
- 
-# eval_com_est (Intermediario(programa,​empty));;​ 
-- : estado list = 
-[Intermediario 
-  (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)))))), 
-  <​fun>​);​ 
- ​Intermediario 
-  (Seq (Skip, 
-    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)))))), 
-  <​fun>​);​ 
- ​Intermediario 
-  (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))))), 
-  <​fun>​);​ 
-  
-  ... 
 </​code>​ </​code>​
ocaml.1156901736.txt.gz · Esta página foi modificada pela última vez em: 2010/01/18 15:45 (Edição externa)