import java.util.*;
public class variable implements Comparator {
// for comparing & sorting variables
public int compare(Object o1, Object o2) {
variable v1 = (variable) o1;
variable v2 = (variable) o2;
if (v1.whenSet < v2.whenSet) return -1;
if (v1.whenSet == v2.whenSet) return 0;
return 1;
}
static int timer;
int whenSet; // variable assignment order
node reason; // formula that lead to the deduction
ArrayList antecedents; // variables used in computing variable's value
boolean isRoot; // is root variable?
public void reset() {
whenSet = 0;
reason = null;
antecedents = null;
isRoot = false;
original();
}
void resetRoot() {
timer = 1;
whenSet = 0;
reason = null;
antecedents = null;
isRoot = true;
original();
}
public void set( boolean negated ) {
original(negated);
whenSet = timer++;
}
// forms union of all antecedents
void collectAntecedents( TreeSet ts ) {
if (antecedents == null) return;
Iterator i = antecedents.iterator();
while (i.hasNext()) {
variable v = (variable) i.next();
if (!ts.contains(v)) {
ts.add(v);
v.collectAntecedents(ts);
}
}
}
String shortName() {
if (name.startsWith("_")) return name.substring(1);
return name;
}
String explainVariable() {
String x;
// this is a hack, due to the strange naming conventions.
// we don't want to generate explanations of the form
// MSTPrim because (_MSTPrim iff MSTPrim)
// so we weed out any "reason" that generates (_x iff x)
if (reason instanceof iff)
if (reason.left.toString().equals("_"+reason.right.toString()))
return "";
if (value == variable.U) return "";
if (value == variable.F) x = "not " + shortName();
else x = shortName();
if (antecedents == null)
if (isRoot)
return x + " because it is root of grammar\n";
else
return x + " because set by user\n";
return x + " because " + reason.toString().replace("_","") + "\n";
}
String explainValue() { // returns explanation of why variable has its value
TreeSet ts = new TreeSet((Comparator)this);
// collect all variables together that contribute to this variable's
// value
ts.add((variable) this);
collectAntecedents( ts );
// now, iterate over this set in order from ground up
String result = "";
Iterator i = ts.iterator();
while (i.hasNext()) {
variable v = (variable) i.next();
result = result + v.explainVariable();
}
return result;
}
// justify remembers why a variable's value was set the way it was
public void justify( cnfClause r ) {
reason = r.formula;
antecedents = new ArrayList();
Iterator i = r.terms.iterator();
while (i.hasNext()) {
cterm c = (cterm) i.next();
if (!c.var.equals((variable) this))
antecedents.add(c.var);
}
original(r);
}
public void justify() {
reason = null;
antecedents = null;
isRoot = false;
whenSet = timer++; // root is always the first
original();
}
}