Advertisement
Guest User

Untitled

a guest
Nov 5th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. fun substitute variables expr =
  2. let
  3.     fun kleisliMap _ tl [] = ([], tl)
  4.     | kleisliMap f tl (hd::tail) = let
  5.         val (res, tl2) = f tl hd
  6.         val (xs, tl3) = kleisliMap f tl2 tail
  7.     in
  8.         (res::xs, tl3)
  9.     end
  10.     fun substitute (hd::tail) expr =
  11.         (case expr of
  12.             True => (True, hd::tail)
  13.             | False => (False, hd::tail)
  14.             | Variable var => if contains (hd::tail) var then raise InvalidVariable
  15.                               else (Variable var, hd::tail)
  16.             | Equiv (left, right) =>
  17.                 let
  18.                     val (l, remaining) = substitute tail left
  19.                     val (r, remaining) = substitute remaining right
  20.                 in
  21.                     (Equiv (Variable hd, Equiv (l, r)), remaining)
  22.                 end
  23.             | Implies (left, right) =>
  24.                 let
  25.                     val (l, remaining) = substitute tail left
  26.                     val (r, remaining) = substitute remaining right
  27.                 in
  28.                     (Equiv (Variable hd, Implies (l, r)), remaining)
  29.                 end
  30.             | And expressions =>
  31.                 let
  32.                     val (expressions, tail) = kleisliMap substitute tail expressions
  33.                 in
  34.                     (Equiv (Variable hd, And expressions), tail)
  35.                 end
  36.             | Or expressions =>
  37.                 let
  38.                     val (expressions, tail) = kleisliMap substitute tail expressions
  39.                 in
  40.                     (Equiv (Variable hd, Or expressions), tail)
  41.                 end
  42.             | Not expr =>
  43.                 let
  44.                     val (e, remaining) = substitute tail expr
  45.                 in
  46.                     (Equiv (Variable hd, Not e), remaining)
  47.                 end)
  48.         | substitute [] expr =
  49.             case expr of
  50.                 Or _ => raise InsufficientVariables
  51.                 | And _ => raise InsufficientVariables
  52.                 | Implies _ => raise InsufficientVariables
  53.                 | Equiv _ => raise InsufficientVariables
  54.                 | Not _ => raise InsufficientVariables
  55.                 | e => (e, [])
  56.     val (res, _) = substitute variables expr
  57. in
  58.     res
  59. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement