Advertisement
Guest User

Untitled

a guest
Nov 9th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. fun SATsolver variables expr =
  2.     let
  3.         fun isVariableValid variable value variables = eval_variable variable variables = value
  4.         handle InvalidVariable => true (* not yet 'removed' *)
  5.  
  6.         fun safeValueOf ((name, value)::tail) variable = if name = variable then SOME value
  7.                                                          else safeValueOf tail variable
  8.             | safeValueOf [] _ = NONE
  9.  
  10.         (* prune single variables *)
  11.         fun findSingleVariables variables expr =
  12.             case expr of
  13.                 Or [Variable v] => if isVariableValid v true variables then (Or [True], (v, true)::variables)
  14.                                    else raise InvalidVariable
  15.                 | Or [Not (Variable v)] => if isVariableValid v false variables then (Or [Not False], (v, false)::variables)
  16.                                            else raise InvalidVariable
  17.                 | True => (True, variables)
  18.                 | False => (False, variables)
  19.                 | Variable var => (case safeValueOf variables var of
  20.                     SOME true => (True, variables)
  21.                     | SOME false => (False, variables)
  22.                     | NONE => (Variable var, variables))
  23.                 | Equiv (left_expr, right_expr) =>
  24.                     let
  25.                         val (left, variables) = findSingleVariables variables left_expr
  26.                         val (right, variables) = findSingleVariables variables right_expr
  27.                     in
  28.                         (Equiv (left, right), variables)
  29.                     end
  30.                 | Implies (left_expr, right_expr) =>
  31.                     let
  32.                         val (left, variables) = findSingleVariables variables left_expr
  33.                         val (right, variables) = findSingleVariables variables right_expr
  34.                     in
  35.                         (Equiv (left, right), variables)
  36.                     end
  37.                 | And expressions =>
  38.                     let
  39.                         val (expressions, variables) = kleisliMap findSingleVariables variables expressions
  40.                     in
  41.                         (And expressions, variables)
  42.                     end
  43.                 | Or expressions =>
  44.                     let
  45.                         val (expressions, variables) = kleisliMap findSingleVariables variables expressions
  46.                     in
  47.                         (Or expressions, variables)
  48.                     end
  49.                 | Not expr =>
  50.                     let
  51.                         val (expr, variables) = findSingleVariables variables expr
  52.                     in
  53.                         (Not expr, variables)
  54.                     end
  55.  
  56.         fun selectVariable variables expr =
  57.             let
  58.             in
  59.                 case expr of
  60.                     Equiv _ => NONE
  61.                     | Implies _ => NONE
  62.                     | And [] => NONE
  63.                     | Or [] => NONE
  64.                     | True => NONE
  65.                     | False => NONE
  66.  
  67.                     | And expressions =>
  68.                         let
  69.                             (* can optimize by only taking first *)
  70.                             val variables = compactMap $ map (selectVariable variables) expressions
  71.                         in
  72.                             case variables of
  73.                                 h::_ => SOME h
  74.                                 | [] => NONE
  75.                         end
  76.                     | Or expressions =>
  77.                         let
  78.                             (* can optimize by only taking first *)
  79.                             val variables = compactMap $ map (selectVariable variables) expressions
  80.                         in
  81.                             case variables of
  82.                                 h::_ => SOME h
  83.                                 | [] => NONE
  84.                         end
  85.                     | Variable var => (case safeValueOf variables var of
  86.                         SOME _ => NONE
  87.                         | NONE => SOME var)
  88.                     | Not expr => selectVariable variables expr
  89.             end
  90.  
  91.         val (updatedExpr, variables) = findSingleVariables variables expr
  92.         val simplified = simplify updatedExpr
  93.  
  94.         fun optToStr (SOME _) = "SOME" | optToStr NONE = "NONE";
  95.  
  96. (*      val _ = print $ toString expr
  97.         val _ = print $ "\n"
  98.         val _ = print $ toString $ updatedExpr
  99.         val _ = print $ "\n"
  100.         val _ = print $ varsToString $ variables
  101.         val _ = print $ "\n"
  102.         val _ = print $ toString $ simplified
  103.         val _ = print $ "\n"*)
  104.     in
  105.         case simplified of
  106.             True => SOME variables
  107.             | And [] => SOME variables
  108.             | False => NONE
  109.             | Or [] => NONE
  110.             | _ =>
  111.                 let
  112.                     val var = selectVariable variables simplified
  113.                 in
  114.                     (* why this doesn't work ???
  115.                     case Option.map (fn var => SATsolver ((var, true)::variables) simplified) var of
  116.                         SOME vars => vars
  117.                         | NONE => (case Option.map (fn var => SATsolver ((var, false)::variables) simplified) var of
  118.                             SOME vars => vars
  119.                             | NONE => NONE)*)
  120.  
  121.                     (* this works just fine
  122.                     case var of
  123.                         SOME var => (case SATsolver ((var, true)::variables) simplified of
  124.                             SOME vars => SOME vars
  125.                             | NONE => (case SATsolver ((var, false)::variables) simplified of
  126.                                 SOME vars => SOME vars
  127.                                 | NONE => NONE))
  128.                         | NONE => NONE*)
  129.  
  130.                     (* this seems the nicest *)
  131.                     case var of
  132.                         SOME var => mapNone (fn () => (SATsolver ((var, false)::variables) simplified))
  133.                                             (SATsolver ((var, true)::variables) simplified)
  134.                         | NONE => NONE
  135.                 end
  136.     end
  137.     handle InvalidVariable => NONE;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement