annotate src/lite/BDDSolver.java @ 64:80db395eeb30 quantifier-worked

*** empty log message ***
author kono
date Thu, 10 Jan 2008 18:16:00 +0900
parents d6a300cdd18e
children 4ced2af1ff09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
42
kono
parents:
diff changeset
1 package lite;
kono
parents:
diff changeset
2
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
3 import sbdd.BDDID;
44
6d231112c761 *** empty log message ***
kono
parents: 43
diff changeset
4 import sbdd.SBDDFactoryInterface;
42
kono
parents:
diff changeset
5 import verifier.Backtrack;
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 public class BDDSolver extends ITLSolver {
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 /*
kono
parents:
diff changeset
10 * var?high:low
kono
parents:
diff changeset
11 */
kono
parents:
diff changeset
12 public ITLSolver var;
kono
parents:
diff changeset
13 public BDDSolver high; // true
kono
parents:
diff changeset
14 public BDDSolver low; // flase
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
15 public BDDID id;
42
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 public BDDSolver(ITLSolver var, BDDSolver high, BDDSolver low) {
kono
parents:
diff changeset
18 this.var = var;
kono
parents:
diff changeset
19 this.high = high;
kono
parents:
diff changeset
20 this.low = low;
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
21 id = BDDID.Variable;
42
kono
parents:
diff changeset
22 }
kono
parents:
diff changeset
23
kono
parents:
diff changeset
24 public BDDSolver(ITLSolver var, ITLSolver high, ITLSolver low) {
kono
parents:
diff changeset
25 this.var = var;
kono
parents:
diff changeset
26 this.high = (BDDSolver) high;
kono
parents:
diff changeset
27 this.low = (BDDSolver) low;
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
28 id = BDDID.Variable;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
29 }
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
30
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
31 public BDDSolver(BDDID id, int hash) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
32 // primitives
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
33
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
34 this.var = null;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
35 this.var = null;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
36 this.var = null;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
37
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
38 this.id = id;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
39 this.hash = hash;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
40 }
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
41
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
42 public BDDSolver(ITLSolver v, ITLSolver high, ITLSolver low, BDDID id) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
43 // for modal node with id
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
44 this(v,high,low);
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
45 this.id = id;
42
kono
parents:
diff changeset
46 }
kono
parents:
diff changeset
47
46
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
48 public BDDSolver(ITLSolver v, BDDID id, int hash) {
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
49 this(v,null,null);
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
50 this.id = id;
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
51 this.hash = hash;
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
52 }
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
53
42
kono
parents:
diff changeset
54 public String toString() {
46
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
55 if (var==null) {
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
56 if (id!=null) return id.toString();
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
57 else return "null";
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
58 }
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
59 if (id==BDDID.BDD) {
63
d6a300cdd18e きらかに、exists はバグってるね。
kono
parents: 60
diff changeset
60 if (high.id==BDDID.True&&low.id==BDDID.False)
d6a300cdd18e きらかに、exists はバグってるね。
kono
parents: 60
diff changeset
61 return var.toString();
d6a300cdd18e きらかに、exists はバグってるね。
kono
parents: 60
diff changeset
62 else if (high.id==BDDID.False&&low.id==BDDID.True)
d6a300cdd18e きらかに、exists はバグってるね。
kono
parents: 60
diff changeset
63 return "~("+var+")";
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
64 return "("+var+"?"+high+":"+low+")";
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
65 }
42
kono
parents:
diff changeset
66 return var.toString();
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 public boolean value() {
kono
parents:
diff changeset
70 return var.value()? high.value() : low.value();
kono
parents:
diff changeset
71 }
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73
kono
parents:
diff changeset
74 public ITLSolver sat(ITLSatisfier sat, Continuation next) throws Backtrack {
53
bea547f744d7 *** empty log message ***
kono
parents: 48
diff changeset
75 if (id!=BDDID.Variable&&id!=BDDID.BDD) {
43
089665ec08ee *** empty log message ***
kono
parents: 42
diff changeset
76 return var.sat(sat,next);
089665ec08ee *** empty log message ***
kono
parents: 42
diff changeset
77 }
42
kono
parents:
diff changeset
78 return var.sat(sat, new Continuation(sat,next,this));
kono
parents:
diff changeset
79 }
kono
parents:
diff changeset
80
kono
parents:
diff changeset
81 @Override
kono
parents:
diff changeset
82 public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack {
kono
parents:
diff changeset
83 if (value==null) {
kono
parents:
diff changeset
84 return low.sat(sat, next);
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
85 } else if (value==sat.true_) {
42
kono
parents:
diff changeset
86 return high.sat(sat, next);
kono
parents:
diff changeset
87 } else {
kono
parents:
diff changeset
88 return high.sat(sat, new Continuation(sat,next,
kono
parents:
diff changeset
89 new BDDSolver2(value)));
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91 }
kono
parents:
diff changeset
92
kono
parents:
diff changeset
93 class BDDSolver2 implements Next {
kono
parents:
diff changeset
94 ITLSolver cond;
kono
parents:
diff changeset
95 public BDDSolver2(ITLSolver value) {
kono
parents:
diff changeset
96 cond = value;
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver value) throws Backtrack {
kono
parents:
diff changeset
100 return low.sat(sat, new Continuation(sat,next,
kono
parents:
diff changeset
101 new BDDSolver3(cond,value)));
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103 }
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 class BDDSolver3 implements Next {
kono
parents:
diff changeset
106 ITLSolver cond, high;
kono
parents:
diff changeset
107 public BDDSolver3(ITLSolver cond, ITLSolver value) {
kono
parents:
diff changeset
108 this.cond = cond;
kono
parents:
diff changeset
109 high = value;
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 public ITLSolver next(ITLSatisfier sat,Continuation next, ITLSolver low) throws Backtrack {
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
113 if (low==sat.true_ && high==sat.true_)
42
kono
parents:
diff changeset
114 return next.sat(low);
kono
parents:
diff changeset
115 if (low==null && high==null)
kono
parents:
diff changeset
116 return next.sat(null);
kono
parents:
diff changeset
117 if (low == high) {
kono
parents:
diff changeset
118 return next.sat(low);
kono
parents:
diff changeset
119 } else {
kono
parents:
diff changeset
120 // lf.bddNode(cond,high,low) won't work
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
121 if (low==null) low = sat.lf.falseNode();
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
122 if (high==null) high = sat.lf.falseNode();
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
123 // if (cond==null) cond = sat.lf.falseNode();
64
80db395eeb30 *** empty log message ***
kono
parents: 63
diff changeset
124 ITLSolver value = sat.lf.orNode(
42
kono
parents:
diff changeset
125 sat.lf.andNode(cond, high),
64
80db395eeb30 *** empty log message ***
kono
parents: 63
diff changeset
126 sat.lf.andNode(sat.lf.notNode(cond), low));
80db395eeb30 *** empty log message ***
kono
parents: 63
diff changeset
127 if (value==sat.false_) value = null;
80db395eeb30 *** empty log message ***
kono
parents: 63
diff changeset
128 return next.sat(value);
42
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131 }
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
134 public ITLSolver and(SBDDFactoryInterface sf,BDDSolver right) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
135 switch(id) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
136 case True: return right;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
137 case False: return sf.falseNode();
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
138 }
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
139 switch(order(var,right.var)) {
42
kono
parents:
diff changeset
140 case 0:
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
141 return sf.bddNode(var,high.and(sf,right.high),low.and(sf,right.low));
42
kono
parents:
diff changeset
142 case 1:
kono
parents:
diff changeset
143 return right.and(sf,this);
kono
parents:
diff changeset
144 case -1:
kono
parents:
diff changeset
145 default:
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
146 return sf.bddNode(var,high.and(sf,right),low.and(sf,right));
42
kono
parents:
diff changeset
147 }
kono
parents:
diff changeset
148 }
kono
parents:
diff changeset
149
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
150 public ITLSolver or(SBDDFactoryInterface sf,BDDSolver right) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
151 switch(id) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
152 case True: return sf.trueNode();
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
153 case False: return right;
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
154 }
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
155 switch(order(var,right.var)) {
42
kono
parents:
diff changeset
156 case 0:
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
157 return sf.bddNode(var,high.or(sf,right.high),low.or(sf,right.low));
42
kono
parents:
diff changeset
158 case 1:
kono
parents:
diff changeset
159 return right.or(sf,this);
kono
parents:
diff changeset
160 case -1:
kono
parents:
diff changeset
161 default:
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
162 return sf.bddNode(var,high.or(sf,right),low.or(sf,right));
42
kono
parents:
diff changeset
163 }
kono
parents:
diff changeset
164 }
kono
parents:
diff changeset
165
kono
parents:
diff changeset
166
45
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
167 public ITLSolver not(SBDDFactoryInterface sf) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
168 switch(id) {
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
169 case True: return sf.falseNode();
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
170 case False: return sf.trueNode();
0258fcdf488c *** empty log message ***
kono
parents: 44
diff changeset
171 }
60
ff125345619d exists does not terminate...
kono
parents: 53
diff changeset
172 return sf.bddNode(var,high.toSBDD(sf).not(sf),low.toSBDD(sf).not(sf));
42
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
175 int order(ITLSolver a,ITLSolver b) {
42
kono
parents:
diff changeset
176 return a.toString().compareTo(b.toString());
kono
parents:
diff changeset
177 }
kono
parents:
diff changeset
178
44
6d231112c761 *** empty log message ***
kono
parents: 43
diff changeset
179 public BDDSolver toSBDD(SBDDFactoryInterface sf) {
42
kono
parents:
diff changeset
180 return this;
kono
parents:
diff changeset
181 }
kono
parents:
diff changeset
182
46
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
183
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
184 static final int PAIR(int a, int b) {
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
185 return ((a + b) * (a + b + 1) / 2 + a);
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
186 }
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
187 static final int TRIPLE(int a, int b, int c) {
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
188 return (PAIR(c, PAIR(a, b)));
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
189 }
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
190
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
191 static final int NODEHASH(int lvl, int l, int h) {
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
192 return Math.abs(TRIPLE(lvl, l, h));
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
193 }
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
194
42
kono
parents:
diff changeset
195 public int hashCode() {
46
bdb6f31782d4 *** empty log message ***
kono
parents: 45
diff changeset
196 if (hash!=-1) return hash;
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
197 return hash = NODEHASH(var.hashCode(),low.hashCode(),high.hashCode());
42
kono
parents:
diff changeset
198 }
kono
parents:
diff changeset
199
47
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
200 public boolean equals(Object o) {
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
201 if (o==this) return true;
47
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
202 if (o.hashCode()!=hashCode()) return false;
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
203 if (o.getClass()==this.getClass()) {
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
204 BDDSolver v = (BDDSolver)o;
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
205 switch(id) {
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
206 case True: case False: case Empty:
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
207 return id == v.id;
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
208 default:
48
49ccbe7a0a32 BDD done (?)
kono
parents: 47
diff changeset
209 return var.equals(v.var)&&low.equals(v.low)&&high.equals(v.high);
47
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
210 }
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
211 }
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
212 return false;
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
213 }
cbe1b120cb53 *** empty log message ***
kono
parents: 46
diff changeset
214
42
kono
parents:
diff changeset
215 public BDDSolver high() {
kono
parents:
diff changeset
216 return high;
kono
parents:
diff changeset
217 }
kono
parents:
diff changeset
218
kono
parents:
diff changeset
219 public BDDSolver low() {
kono
parents:
diff changeset
220 return low;
kono
parents:
diff changeset
221 }
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 public ITLSolver var() {
kono
parents:
diff changeset
224 return var;
kono
parents:
diff changeset
225 }
kono
parents:
diff changeset
226 }