Mercurial > hg > Applications > JavaLite
changeset 63:d6a300cdd18e
きらかに、exists はバグってるね。
author | kono |
---|---|
date | Thu, 10 Jan 2008 02:29:46 +0900 |
parents | c392bd59155f |
children | 80db395eeb30 |
files | src/lite/BDDSolver.java src/lite/ExistsSolver.java |
diffstat | 2 files changed, 23 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lite/BDDSolver.java Thu Jan 10 02:29:42 2008 +0900 +++ b/src/lite/BDDSolver.java Thu Jan 10 02:29:46 2008 +0900 @@ -57,6 +57,10 @@ else return "null"; } if (id==BDDID.BDD) { + if (high.id==BDDID.True&&low.id==BDDID.False) + return var.toString(); + else if (high.id==BDDID.False&&low.id==BDDID.True) + return "~("+var+")"; return "("+var+"?"+high+":"+low+")"; } return var.toString();
--- a/src/lite/ExistsSolver.java Thu Jan 10 02:29:42 2008 +0900 +++ b/src/lite/ExistsSolver.java Thu Jan 10 02:29:46 2008 +0900 @@ -27,12 +27,14 @@ @Override public ITLSolver sat(ITLSatisfier sat, Continuation next) throws Backtrack { + boolean old = var.value; makeLocal(sat); var.setValue(true); try { return node.sat(sat, new Continuation(sat,next,this)); } catch (Backtrack e) { restoreLocal(sat); + var.setValue(old); throw sat.backtrack; } } @@ -55,12 +57,13 @@ } } - private ITLSolver restoreLocal(ITLSatisfier sat,ITLSolver value,Continuation next) throws Backtrack { + private ITLSolver restoreLocal(ITLSatisfier sat,boolean now,ITLSolver value,Continuation next) throws Backtrack { restoreLocal(sat); try { return next.sat(value); } catch (Backtrack e) { makeLocal(sat); + var.setValue(now); throw sat.backtrack; } } @@ -71,7 +74,7 @@ var.setValue(false); return node.sat(sat, new Continuation(sat,next ,new ExistsSolver3())); } else if (value==sat.true_) { - return restoreLocal(sat,value,next); + return restoreLocal(sat,var.value,value,next); } else { var.setValue(false); residue = value; @@ -83,18 +86,28 @@ class ExistsSolver2 implements Next { public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack { if (value==null) { - value = residue; + value = sat.lf.existsNode(var,residue); } else if (value==sat.true_) { } else { - value = sat.lf.existsNode(var,sat.lf.orNode(residue,value)); + value = sat.lf.orNode(residue,value); + if (value==sat.true_) { + } else { + value = sat.lf.existsNode(var,value); + } } - return restoreLocal(sat,value,next); + return restoreLocal(sat,var.value,value,next); } } + class ExistsSolver3 implements Next { public ITLSolver next(ITLSatisfier sat, Continuation next, ITLSolver value) throws Backtrack { - return restoreLocal(sat,value,next); + if (value==null) { + } else if (value==sat.true_) { + } else { + value = sat.lf.existsNode(var, value); + } + return restoreLocal(sat,var.value,value,next); } }