Guest User

Untitled

a guest
Jan 23rd, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 0.86 KB | None | 0 0
  1. type expr =     Var of char
  2.                     | Abs of char * expr
  3.                     | App of expr * expr
  4.                     ;;
  5.  
  6.  
  7. let freevar var exp =
  8.     let rec freevarIter var  = function
  9.          Var  x           -> true
  10.         |App (u,v)        -> ((freevarIter var u) or (freevarIter var v))
  11.         |Abs (x,u) when x  = var -> false
  12.         |Abs (x,u) when x  !=var -> freevarIter var u
  13.                
  14.         in freevarIter var exp;;
  15.  
  16.  
  17.  
  18. let rec subst var:expr trm:expr exp:expr = match exp with
  19.         Var  x      when x  = var -> trm
  20.     |   Var  y      when y != var -> y
  21.     |   App (u,v)                           -> App((subst var trm u), (subst var trm v))
  22.     |   Abs (x,u) when (occurrence x u) = false -> Abs(x,u)
  23.     |   Abs (y,u) when ((y != var) AND  (freevar y trm) = false) -> Abs(y,subst var trm u)
  24.     | Abs (y,u) when (freevar y trm) and  (let z = char_of_int( ( Random.int 25 ) + 65 ) );((freevar z u) OR (freevar z trm)) -> subst(var trm (Abs(z,subst z y)));;
Add Comment
Please, Sign In to add comment