From 9ac401bdd44017e13d19d83518da1719d25b890f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Tue, 1 May 2012 17:22:29 +0200
Subject: [PATCH] work in progress

---
 testcases/SatFun.scala | 51 +++++++++++++++++++++++++++++++++---------
 1 file changed, 40 insertions(+), 11 deletions(-)

diff --git a/testcases/SatFun.scala b/testcases/SatFun.scala
index e910e3e53..8dc7995c1 100644
--- a/testcases/SatFun.scala
+++ b/testcases/SatFun.scala
@@ -12,10 +12,12 @@ object SatFun {
   sealed abstract class VarList
   case class VarCons(head: Int, tail: VarList) extends VarList
   case class VarNil() extends VarList
+  case class VarLit(value: Boolean) extends VarList
 
   sealed abstract class ClauseList
   case class ClauseCons(head: VarList, tail: ClauseList) extends ClauseList
   case class ClauseNil() extends ClauseList
+  case class ClauseLit(value: Boolean) extends ClauseList
 
   def eval(formula: Formula, assignment: Map[Int, Boolean]): Boolean = formula match {
     case Var(n) => assignment(n)
@@ -27,18 +29,22 @@ object SatFun {
   def evalCnf(clauses: ClauseList, assignment: Map[Int, Boolean]): Boolean = clauses match {
     case ClauseCons(cl, cls) => evalClauseCnf(cl, assignment) && evalCnf(cls, assignment)
     case ClauseNil() => false
+    case ClauseLit(b) => b
   }
   def evalDnf(clauses: ClauseList, assignment: Map[Int, Boolean]): Boolean = clauses match {
     case ClauseCons(cl, cls) => evalClauseDnf(cl, assignment) || evalDnf(cls, assignment)
     case ClauseNil() => true
+    case ClauseLit(b) => b
   }
   def evalClauseCnf(clause: VarList, assignment: Map[Int, Boolean]): Boolean = clause match {
     case VarCons(v, vs) => (if(v < 0) assignment(-v) else assignment(v)) || evalClauseCnf(vs, assignment)
     case VarNil() => false
+    case VarLit(b) => b
   }
   def evalClauseDnf(clause: VarList, assignment: Map[Int, Boolean]): Boolean = clause match {
     case VarCons(v, vs) => (if(v < 0) assignment(-v) else assignment(v)) && evalClauseDnf(vs, assignment)
     case VarNil() => true
+    case VarLit(b) => b
   }
 
   def vars(formula: Formula): Set[Int] = formula match {
@@ -51,16 +57,19 @@ object SatFun {
   def concatClauses(cll1: ClauseList, cll2: ClauseList): ClauseList = cll1 match {
     case ClauseCons(cl, tail) => ClauseCons(cl, concatClauses(tail, cll2))
     case ClauseNil() => cll2
+    case cl@ClauseLit(_) => ClauseCons(cl, clls)
   }
 
   def concatVars(l1: VarList, l2: VarList): VarList = l1 match {
     case VarCons(v, vs) => VarCons(v, concatVars(vs, l2))
     case VarNil() => l2
+    case v@VarLit(_) => VarCons(v, vs)
   }
 
   def distributeClause(cl: VarList, cll: ClauseList): ClauseList = cll match {
     case ClauseCons(cl2, cl2s) => ClauseCons(concatVars(cl, cl2), distributeClause(cl, cl2s))
     case ClauseNil() => ClauseNil()
+    case cl@ClauseLit(b) => ClauseCons(cl, clls)
   }
 
   def distribute(cll1: ClauseList, cll2: ClauseList): ClauseList = cll1 match {
@@ -124,6 +133,37 @@ object SatFun {
     case ClauseNil() => false
   }
 
+
+  def substitute(formula: ClauseList, variable: Int, value: Boolean): ClauseList = formula match {
+    case ClauseNil() => ClauseNil()
+    case ClauseCons(cl, cls) => 
+  }
+
+  def substitute(vars: VarList, variable: Int, value: Boolean): VarList = vars match {
+    case VarNil() => VarNil()
+    case VarCons(v, vs) => if(v == variable) 
+  }
+
+  def choose(formula: ClauseList): Int = {
+    formula.head.head
+  }
+
+  def dpll(formula: ClauseList): Boolean = {
+
+  }
+
+
+  def main(args: Array[String]) {
+    val f1 = And(Var(1), Or(Var(1), Not(Var(2)), Var(3)), Var(2), Not(Var(3)))
+    val dnff1 = clauses2list(dnfNaive(f1))
+    val vars1 = vars(f1)
+    vars.foreach(v => {
+
+
+    })
+    println(f1 + " translated in dnf as:\n\t" + dnff1.mkString("\n\t"))
+  }
+
   //some non-leon functions to test the program with scala
   object False {
     def apply(): Formula = And(Var(1), Not(Var(1)))
@@ -153,15 +193,4 @@ object SatFun {
     case ClauseCons(cl, cls) => clause2list(cl) :: clauses2list(cls)
     case ClauseNil() => Nil
   }
-
-  def main(args: Array[String]) {
-    val f1 = And(Var(1), Or(Var(1), Not(Var(2)), Var(3)), Var(2), Not(Var(3)))
-    val dnff1 = clauses2list(dnfNaive(f1))
-    val vars1 = vars(f1)
-    vars.foreach(v => {
-
-
-    })
-    println(f1 + " translated in dnf as:\n\t" + dnff1.mkString("\n\t"))
-  }
 }
-- 
GitLab