changeset 42:ddd38f16b014 sbdd

SBDD
author kono
date Sat, 05 Jan 2008 09:47:04 +0900
parents a6b6e2ea7792
children 089665ec08ee
files src/lite/AndSolver.java src/lite/BDDSolver.java src/lite/ChopSolver.java src/lite/EmptySolver.java src/lite/ExistsSolver.java src/lite/FalseSolver.java src/lite/ITLSolver.java src/lite/NextSolver.java src/lite/NotSolver.java src/lite/NumberSolver.java src/lite/OrSolver.java src/lite/PredicateSolver.java src/lite/ProjectionSolver.java src/lite/TrueSolver.java src/lite/VariableSolver.java
diffstat 15 files changed, 329 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/lite/AndSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/AndSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 
@@ -50,5 +51,10 @@
 			}
 		}
 	}
+
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return left.toSBDD(sf).and(sf, right.toSBDD(sf));
+	}
+
 	
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lite/BDDSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -0,0 +1,160 @@
+package lite;
+
+import sbdd.SBDDFactory;
+import verifier.Backtrack;
+
+public class BDDSolver extends ITLSolver {
+	
+	/*
+	 * var?high:low
+	 */
+	public ITLSolver var;
+	public BDDSolver high; // true
+	public BDDSolver low;  // flase
+	public int hash;
+	
+	
+	public BDDSolver(ITLSolver var, BDDSolver high, BDDSolver low) {
+		this.var = var;
+		this.high = high;
+		this.low  = low;
+	}
+
+	public BDDSolver(ITLSolver var, ITLSolver high, ITLSolver low) {
+		this.var = var;
+		this.high = (BDDSolver) high;
+		this.low  = (BDDSolver) low;
+	}
+
+	public String toString() {
+		/*
+		if (var==SBDDFactory.trueSolver) {
+			return "true";
+		} else if (var==SBDDFactory.falseSolver ) {
+			return "false";
+		} else if (var==SBDDFactory.chopSolver  ) {
+			return "("+high+" & "+low+")";
+		} else if (var==SBDDFactory.existsSolver) {
+			return "exists("+high+" , "+low+")";
+		} else if (var==SBDDFactory.nextSolver  ) {
+			return "@("+high+")";
+		} else if (var==SBDDFactory.emptySolver ) {
+			return "empty";
+		} else if (var==SBDDFactory.projSolver  ) {
+			return "proj("+high+" , "+low+")";
+		} */
+		return var.toString();
+	}
+	
+	public boolean value() {
+		return var.value()? high.value() : low.value();
+	}
+
+
+	public ITLSolver sat(ITLSatisfier sat, Continuation next) throws Backtrack {
+		return var.sat(sat, new Continuation(sat,next,this));
+	}
+
+	@Override
+	public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack {
+		if (value==null) {
+			return low.sat(sat, next);
+		} else if (value==ITLSatisfier.true_) {
+			return high.sat(sat, next);
+		} else {
+			return high.sat(sat, new Continuation(sat,next,
+					new BDDSolver2(value)));
+		}
+	}
+
+	class BDDSolver2 implements Next {
+		ITLSolver cond;
+		public BDDSolver2(ITLSolver value) {
+			cond = value;
+		}
+
+		public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack {
+			return low.sat(sat, new Continuation(sat,next,
+					new BDDSolver3(cond,value)));
+		}
+	}
+
+	class BDDSolver3 implements Next {
+		ITLSolver cond, high;
+		public BDDSolver3(ITLSolver cond, ITLSolver value) {
+			this.cond = cond;
+			high = value;
+		}
+
+		public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver low) throws Backtrack {
+			if (low==ITLSatisfier.true_ && high==ITLSatisfier.true_) 
+				return next.sat(low);
+			if (low==null && high==null) 
+				return next.sat(null);
+			if (low == high) {
+				return next.sat(low);
+			} else {
+				// lf.bddNode(cond,high,low) won't work
+				return next.sat(sat.lf.orNode(
+						sat.lf.andNode(cond, high),
+						sat.lf.andNode(sat.lf.notNode(cond), low)));
+			}
+		}
+	}
+
+
+	BDDSolver and(SBDDFactory sf,BDDSolver right) {
+		BDDSolver lvar=var.toSBDD(sf),rvar=right.var.toSBDD(sf);
+		switch(order(lvar,rvar)) {
+		case 0:
+			return sf.bddNode(lvar,high.and(sf,right.high),low.and(sf,right.low));
+		case 1:
+			return right.and(sf,this);
+		case -1:
+		default:
+			return sf.bddNode(lvar,high.and(sf,right),low.and(sf,right));
+		}
+	}
+
+	BDDSolver or(SBDDFactory sf,BDDSolver right) {
+		BDDSolver lvar=var.toSBDD(sf),rvar=right.var.toSBDD(sf);
+		switch(order(lvar,rvar)) {
+		case 0:
+			return sf.bddNode(lvar,high.or(sf,right.high),low.or(sf,right.low));
+		case 1:
+			return right.or(sf,this);
+		case -1:
+		default:
+			return sf.bddNode(lvar,high.or(sf,right),low.or(sf,right));
+		}
+	}
+
+
+	BDDSolver not(SBDDFactory sf) {
+		return  sf.bddNode(var.toSBDD(sf),low.toSBDD(sf),high.toSBDD(sf));
+	}
+
+	int order(BDDSolver a,BDDSolver b) {
+		return a.toString().compareTo(b.toString());
+	}
+	
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return this;
+	}
+	
+	public int hashCode() {
+		return this.hash;
+	}
+
+	public BDDSolver high() {
+		return high;
+	}
+
+	public BDDSolver low() {
+		return low;
+	}
+
+	public ITLSolver var() {
+		return var;
+	}
+}
--- a/src/lite/ChopSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/ChopSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class ChopSolver extends ITLSolver {
@@ -8,6 +9,7 @@
 	private ITLSolver later;
 	private VariableSolver innerEmpty;
 	private ITLSolver outerEmpty;
+	ITLSolver later1;
 
 	/*
 	 *    Interval Temporal Logic Chop Operator
@@ -25,13 +27,13 @@
 	 *   
 	 *   case 2  inner empty (outer ~ empty)
 	 *   former (t/f)
-	 *   later  (t/f)
+	 *   later  (t/f/@later)
 	 *   ||----------------------------|
 	 *   next:   @later
 	 *       
 	 *   case 3  inner more
-	 *   former (t/f)
-	 *       later (t/f)
+	 *   former (t/f/@former)
+	 *       later
 	 *   |--|--------------------------|
 	 *   next:   @former&later
 	 *   
@@ -113,17 +115,13 @@
 				return former.sat(sat,  new Continuation(sat,next, new ChopSolver4()));
 			} else {
 				// try innerMore case with this next term
-				return former.sat(sat,  new Continuation(sat,next, new ChopSolver6(value)));
+				later1 = value;
+				return former.sat(sat,  new Continuation(sat,next, new ChopSolver6()));
 			}
 		}
 	}
 	
 	class ChopSolver6 implements Next {
-		ITLSolver later1;
-		public ChopSolver6(ITLSolver value) {
-			later1 = value;
-		}
-
 		public ITLSolver next(ITLSatisfier sat, Continuation next, ITLSolver value) throws Backtrack {
 			sat.restoreEmpty(outerEmpty); // all done
 			if (value==null) {  // former is fail on more inerval
@@ -136,4 +134,20 @@
 			}
 		}
 	}
+
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.chopNode(former.toSBDD(sf), later.toSBDD(sf));
+	}
+
+	public BDDSolver high() {
+		return (BDDSolver)former;
+	}
+
+	public BDDSolver low() {
+		return (BDDSolver)later;
+	}
+
+	public ITLSolver var() {
+		return SBDDFactory.chopSolver;
+	}
 }
--- a/src/lite/EmptySolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/EmptySolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class EmptySolver extends ITLSolver {
@@ -12,4 +13,20 @@
 	public ITLSolver sat(ITLSatisfier sat, Continuation next) throws Backtrack {
 		return sat.empty.sat(sat, next);
 	}
+
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.emptyNode();
+	}
+
+	public BDDSolver high() {
+		return SBDDFactory.trueSolver;
+	}
+
+	public BDDSolver low() {
+		return SBDDFactory.falseSolver;
+	}
+
+	public ITLSolver var() {
+		return SBDDFactory.emptySolver;
+	}
 }
--- a/src/lite/ExistsSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/ExistsSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -2,6 +2,7 @@
 
 import java.util.LinkedList;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class ExistsSolver extends ITLSolver {
@@ -9,6 +10,7 @@
 	ITLSolver node;
 	ITLSolver var;
 	LinkedList<ITLSolver> oldVarList;
+	ITLSolver residue;
 
 	public ExistsSolver(ITLSolver var, ITLSolver node) {
 		this.node = node;
@@ -55,17 +57,13 @@
 			return next.sat(sat.true_());
 		} else {
 			var.setValue(false);
+			residue = value;
 			return node.sat(sat, new Continuation(sat,next,
-					new ExistsSolver2(value)));
+					new ExistsSolver2()));
 		}
 	}
 
 	class ExistsSolver2 implements Next {
-		ITLSolver residue;
-		public ExistsSolver2(ITLSolver value) {
-			residue = value;
-		}
-
 		public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack {
 			restoreLocal(sat);
 			if (value==null) {
@@ -85,4 +83,19 @@
 			return next.sat(value);
 		}
 	}
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.existsNode(var.toSBDD(sf), node.toSBDD(sf));
+	}
+
+	public BDDSolver high() {
+		return (BDDSolver)var;
+	}
+
+	public BDDSolver low() {
+		return (BDDSolver)node;
+	}
+
+	public ITLSolver var() {
+		return SBDDFactory.existsSolver;
+	}
 }
--- a/src/lite/FalseSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/FalseSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class FalseSolver extends ITLSolver {
@@ -14,4 +15,8 @@
 		return "false";
 	}
 
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.falseNode();
+	}
+
 }
--- a/src/lite/ITLSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/ITLSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -5,11 +5,19 @@
 import logicNode.LogicNode;
 import logicNode.MacroNodeInterface;
 
+import sbdd.BDDInterface;
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class ITLSolver extends LogicNode
-	implements MacroNodeInterface<ITLSolver>,Next {
+	implements MacroNodeInterface<ITLSolver>,Next,BDDInterface {
+	
+	public int hash;
 
+	ITLSolver() {
+		hash = this.hashCode();
+	}
+	
 	public ITLSolver sat(ITLSatisfier sat, Continuation next) throws Backtrack {
 		return null;
 	}
@@ -49,5 +57,23 @@
 		return false;
 	}
 
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return null;
+	}
 
+	public BDDSolver high() {
+		return null;
+	}
+
+	public BDDSolver low() {
+		return null;
+	}
+
+	public ITLSolver var() {
+		return null;
+	}
+	
+	public int hashCode() {
+		return hash;
+	}
 }
--- a/src/lite/NextSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/NextSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class NextSolver extends ITLSolver {
@@ -27,4 +28,19 @@
 		}
 	}
 
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.nextNode(node.toSBDD(sf));
+	}
+
+	public BDDSolver high() {
+		return (BDDSolver)node;
+	}
+
+	public BDDSolver low() {
+		return (BDDSolver)node;
+	}
+
+	public ITLSolver var() {
+		return SBDDFactory.nextSolver;
+	}
 }
--- a/src/lite/NotSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/NotSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 
@@ -31,4 +32,8 @@
 		return next.sat(sat.lf.notNode(value));
 	}
 
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return node.toSBDD(sf).not(sf);
+	}
+
 }
--- a/src/lite/NumberSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/NumberSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+
 public class NumberSolver extends ITLSolver {
 
 	int num;
@@ -11,4 +12,5 @@
 	public String toString() {
 		return Integer.toString(num);
 	}
+
 }
--- a/src/lite/OrSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/OrSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class OrSolver extends ITLSolver {
@@ -52,4 +53,7 @@
 		}
 	}
 
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return left.toSBDD(sf).or(sf, right.toSBDD(sf));
+	}
 }
--- a/src/lite/PredicateSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/PredicateSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -2,7 +2,6 @@
 
 import java.util.LinkedList;
 
-
 public class PredicateSolver extends ITLSolver {
 
 	private LinkedList<ITLSolver> arg;
--- a/src/lite/ProjectionSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/ProjectionSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,10 +1,12 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class ProjectionSolver extends ITLSolver {
 
 	ITLSolver clock,interval;
+	ITLSolver clock1;
 
 	/*
 	 *      On interval's every clock, clock is true on clock's sub clock.
@@ -66,17 +68,13 @@
 				return next.sat(value);
 			} else {
 				// try interval keeping @clock
-				return interval.sat(sat, new Continuation(sat,next, new ProjectionSolver3(value)));
+				clock1 = value;
+				return interval.sat(sat, new Continuation(sat,next, new ProjectionSolver3()));
 			}
 		}
 	}
 	
 	class ProjectionSolver3 implements Next {
-		ITLSolver clock1;
-		public ProjectionSolver3(ITLSolver value) {
-			clock1 = value;
-		}
-
 		public ITLSolver next(ITLSatisfier sat, Continuation next, ITLSolver value) throws Backtrack {
 			if (value==null) {  // interval is failed, return null
 				return next.sat(value);
@@ -87,4 +85,20 @@
 			}
 		}
 	}
+
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.projectionNode(clock.toSBDD(sf),interval.toSBDD(sf));
+	}
+
+	public BDDSolver high() {
+		return (BDDSolver)clock;
+	}
+
+	public BDDSolver low() {
+		return (BDDSolver)interval;
+	}
+
+	public ITLSolver var() {
+		return SBDDFactory.projSolver;
+	}
 }
--- a/src/lite/TrueSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/TrueSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class TrueSolver extends ITLSolver {
@@ -15,4 +16,8 @@
 	}
 
 
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.trueNode();
+	}
+
 }
--- a/src/lite/VariableSolver.java	Fri Jan 04 12:07:12 2008 +0900
+++ b/src/lite/VariableSolver.java	Sat Jan 05 09:47:04 2008 +0900
@@ -1,5 +1,6 @@
 package lite;
 
+import sbdd.SBDDFactory;
 import verifier.Backtrack;
 
 public class VariableSolver extends ITLSolver {
@@ -43,4 +44,23 @@
 			}
 		}
 	}
+	
+
+	public BDDSolver toSBDD(SBDDFactory sf) {
+		return sf.variableNode(name, value);
+	}
+	
+
+
+	public BDDSolver high() {
+		return SBDDFactory.trueSolver;
+	}
+
+	public BDDSolver low() {
+		return SBDDFactory.falseSolver;
+	}
+
+	public ITLSolver var() {
+		return this;
+	}
 }