Mercurial > hg > Applications > JavaLite
changeset 61:51e13324a3f1
*** empty log message ***
author | kono |
---|---|
date | Wed, 09 Jan 2008 19:57:56 +0900 |
parents | ff125345619d |
children | c392bd59155f |
files | src/lite/ExistsSolver.java src/lite/VariableSolver.java src/sbdd/SBDDTest.java |
diffstat | 3 files changed, 39 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lite/ExistsSolver.java Wed Jan 09 16:42:51 2008 +0900 +++ b/src/lite/ExistsSolver.java Wed Jan 09 19:57:56 2008 +0900 @@ -11,13 +11,13 @@ ITLSolver node; VariableSolver var; - LinkedList<ITLSolver> oldVarList; + LinkedList<Boolean> oldVarList; ITLSolver residue; public ExistsSolver(VariableSolver var, ITLSolver node) { this.node = node; this.var = var; - oldVarList = new LinkedList<ITLSolver>(); + oldVarList = new LinkedList<Boolean>(); } @@ -29,23 +29,39 @@ public ITLSolver sat(ITLSatisfier sat, Continuation next) throws Backtrack { makeLocal(sat); var.setValue(true); - return node.sat(sat, new Continuation(sat,next,this)); + try { + return node.sat(sat, new Continuation(sat,next,this)); + } catch (Backtrack e) { + restoreLocal(sat); + throw sat.backtrack; + } + } + + + private void restoreLocal(ITLSatisfier sat) { + if (oldVarList.size()>0) { + var.value = oldVarList.getLast(); + oldVarList.removeLast(); + } else { + sat.deleteChoicePoint(var); + } } private void makeLocal(ITLSatisfier sat) { if (sat.hasChoicePoint(var)) { - oldVarList.add(sat.lf.variableNode(var.toString(), var.value)); + oldVarList.add(var.value); } else { sat.addChoicePoint(var); } } - private void restoreLocal(ITLSatisfier sat) { - if (oldVarList.size()>0) { - var.value = oldVarList.getLast().value; - oldVarList.removeLast(); - } else { - sat.deleteChoicePoint(var); + private ITLSolver restoreLocal(ITLSatisfier sat,ITLSolver value,Continuation next) throws Backtrack { + restoreLocal(sat); + try { + return next.sat(value); + } catch (Backtrack e) { + makeLocal(sat); + throw sat.backtrack; } } @@ -55,8 +71,7 @@ var.setValue(false); return node.sat(sat, new Continuation(sat,next ,new ExistsSolver3())); } else if (value==sat.true_) { - restoreLocal(sat); - return next.sat(sat.true_); + return restoreLocal(sat,value,next); } else { var.setValue(false); residue = value; @@ -67,22 +82,19 @@ class ExistsSolver2 implements Next { public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack { - restoreLocal(sat); if (value==null) { - return next.sat(residue); + value = residue; } else if (value==sat.true_) { - return next.sat(sat.true_); } else { - return next.sat(sat.lf.existsNode(var, - sat.lf.orNode(residue,value))); + value = sat.lf.existsNode(var,sat.lf.orNode(residue,value)); } + return restoreLocal(sat,value,next); } } class ExistsSolver3 implements Next { public ITLSolver next(ITLSatisfier sat, Continuation next, ITLSolver value) throws Backtrack { - restoreLocal(sat); - return next.sat(value); + return restoreLocal(sat,value,next); } }
--- a/src/lite/VariableSolver.java Wed Jan 09 16:42:51 2008 +0900 +++ b/src/lite/VariableSolver.java Wed Jan 09 19:57:56 2008 +0900 @@ -47,7 +47,7 @@ public BDDSolver toSBDD(SBDDFactoryInterface sf) { - return sf.variableNode(name, value).toSBDD(sf); + return sf.bddNode(this, sf.trueNode(), sf.falseNode()).toSBDD(sf); } public int hashCode() { @@ -55,6 +55,10 @@ return hash = name.hashCode(); } + @Override + public void setValue(boolean value) { + this.value = value; + } public boolean equals(Object o) { if (o.hashCode()!=hashCode()) return false;
--- a/src/sbdd/SBDDTest.java Wed Jan 09 16:42:51 2008 +0900 +++ b/src/sbdd/SBDDTest.java Wed Jan 09 19:57:56 2008 +0900 @@ -62,12 +62,13 @@ sat.showVerify("fin(p)=([](<>(p)))"); sat.showVerify("fin(p)"); } - sat.showVerify("even(p)"); + sat.showVerify("exists(x,@@x = ~x)"); + //sat.showVerify("even(p)"); //sat.showVerify("evenp(p)"); //at.showVerify("keep(@q = ~q)"); //sat.showVerify("keep(q)"); //sat.showVerify("even(p)<->evenp(p)"); - // System.out.println(sat.state); + System.out.println(sat.state); // sat.p.parse("include('data/example')."); // System.out.println(p.parseCommand.sat.state); }