Advertisement
Guest User

F tuple

a guest
Feb 11th, 2019
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. datatype opr = Sub | Add | Mul | Leq
  2.      and ty = Arrow of ty * ty | Bool | Int | Star of ty list
  3.      and con = IC of int | False | True
  4.      and exp = Abs of string * ty * exp | If of exp * exp * exp | Opr of opr * exp * exp | App of exp * exp | Var of string | Con of con | Tuple of exp list | Proj of int * exp;
  5. exception Error of string;
  6. val nth = List.nth;
  7. fun update env k v l = if k=l then v else env l;
  8. fun map f nil = nil
  9.   | map f (x::xr) = f x::map f xr;
  10. fun elabCon (IC x) = Int
  11.   | elabCon True = Bool
  12.   | elabCon False = Bool;
  13. fun elabOpr Add Int Int = Int
  14.   | elabOpr Sub Int Int = Int
  15.   | elabOpr Mul Int Int = Int
  16.   | elabOpr Leq Int Int = Bool
  17.   | elabOpr _ _ _ = raise Error "T Opr";
  18. fun elab env (Con c) = elabCon c
  19.   | elab env (Var v) = env v
  20.   | elab env (Opr (pr,e1,e2)) = elabOpr pr (elab env e1) (elab env e2)
  21.   | elab env (If (i,t,e)) = (case (elab env i, elab env t, elab env e) of
  22.                                (Bool, t, t') => if t=t' then t else raise Error "T If1"
  23.                              | _ => raise Error "T If2")
  24.   | elab env (Abs (x,t,e)) = Arrow(t,elab (update env x t) e)
  25.   | elab env (App (f,v)) = (case (elab env f, elab env v) of
  26.                               (Arrow(ta,ts), ta') => if ta=ta' then ts else raise Error "T App1"
  27.                             | _ => raise Error "T App2")
  28.   | elab env (Tuple el) = Star (foldr (fn (x,a)=>elab env x :: a) nil el)
  29.   | elab env (Tuple el) = Star (map (elab env) el)
  30.   | elab env (Proj (i,e)) = (case elab env e of
  31.                                Star tl => (nth (tl,i-1) handle Subscript => raise Error "T Proj1")
  32.                              | _ => raise Error "T Proj2");
  33.  
  34. datatype value = IV of int | ProcV of string*(string->value)*exp | TupleV of value list;
  35. fun evalCon (IC x) = IV x
  36.   | evalCon True = IV 1
  37.   | evalCon False = IV 0
  38. fun evalOpr Add (IV x) (IV y) = IV (x+y)
  39.   | evalOpr Sub (IV x) (IV y) = IV (x-y)
  40.   | evalOpr Mul (IV x) (IV y) = IV (x*y)
  41.   | evalOpr Leq (IV x) (IV y) = IV (if x<=y then 1 else 0)
  42.   | evalOpr _ _ _ = raise Error "R Opr"
  43. fun eval env (Con c) = evalCon c
  44.   | eval env (Var v) = env v
  45.   | eval env (Opr(pr,e1,e2)) = evalOpr pr (eval env e1) (eval env e2)
  46.   | eval env (If(i,t,e)) = (case eval env i of
  47.                               IV 0 => eval env e
  48.                             | IV 1 => eval env t
  49.                             | _ => raise Error "R If")
  50.   | eval env (Abs(x,_,e)) = ProcV(x,env,e)
  51.   | eval env (App(f,v)) = (case eval env f of
  52.                              ProcV(x,env',e) => eval (update env' x (eval env v)) e
  53.                            | _ => raise Error "R App")
  54.   | eval env (Tuple es) = TupleV (foldl (fn (x,a) => a@[eval env x]) nil es)
  55.   | eval env (Tuple es) = TupleV (map (eval env) es)
  56.   | eval env (Proj (i,e)) = (case eval env e of
  57.                                TupleV tv => (nth (tv,i-1) handle Subscript => raise Error "R Proj1")
  58.                              |  _ => raise Error "R Proj2");
  59. exception Unbound of string;
  60. fun empty k = raise Unbound k;
  61. fun elabeval k = let
  62.                    val ty = elab empty k
  63.                    val res = eval empty k
  64.                  in print(ty,res) end;
  65. val max_cart = Abs("p",Star[Int,Int],If(Opr(Leq,Proj(1,Var "p"),Proj(2,Var "p")),Proj(2,Var "p"),Proj(1,Var "p")));
  66. elabeval max_cart;
  67. elabeval (App(max_cart,Tuple[Con(IC 3), Con(IC 1)]));
  68. elabeval (Tuple[Con True, Con (IC 5), Abs("x", Int, Opr(Leq,Var "x", Con (IC 5)))]);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement