import java.util.*; import javax.swing.*; class cnfClause { private static void AnnounceProblem( String whatIsIt ) { JOptionPane.showMessageDialog(null, "The following clause is not satisfied:\n" + whatIsIt, "Program Specification Incomplete", JOptionPane.ERROR_MESSAGE); } static boolean complete() { int formulaIndex = 0; // populate list of clause strings if not done already if(grammar._originals.size() == 0) { grammar.propagate(); grammar.reset(); } // go through production formulas Iterator i = (production.Ptable.values()).iterator(); while(i.hasNext()) { production p = (production) (i.next()); node temp = (p.formula).simplify().cnf(); if(temp instanceof and) { ArrayList formulas = new ArrayList(); grammar.splitFormula(formulas, temp); for(int j = 0; j < formulas.size(); j++) { String _original = (String) grammar._originals.get(formulaIndex); clause c = new clause((node) formulas.get(j), null, _original); analyzeClause(c, c.n); // if clause is not satisfied, then spec is not complete if(!grammar.SATISFIED.equals(c.value)) { AnnounceProblem( c._original ); return false; } } } else { String _original = (String) grammar._originals.get(formulaIndex); clause c = new clause(temp, null, _original); analyzeClause(c, c.n); // if clause is not satisfied, then spec is not complete if(!grammar.SATISFIED.equals(c.value)) { AnnounceProblem( c._original ); return false; } } formulaIndex++; } // go through pattern formulas i = (pattern.Ttable.values()).iterator(); while(i.hasNext()) { pattern p = (pattern) (i.next()); node temp = (p.formula).simplify().cnf(); if(temp instanceof and) { ArrayList formulas = new ArrayList(); grammar.splitFormula(formulas, temp); for(int j = 0; j < formulas.size(); j++) { String _original = (String) grammar._originals.get(formulaIndex); clause c = new clause((node) formulas.get(j), null, _original); analyzeClause(c, c.n); // if clause is not satisfied, then spec is not complete if(!grammar.SATISFIED.equals(c.value)) { AnnounceProblem( c._original ); return false; } } } else { String _original = (String) grammar._originals.get(formulaIndex); clause c = new clause(temp, null, _original); analyzeClause(c, c.n); // if clause is not satisfied, then spec is not complete if(!grammar.SATISFIED.equals(c.value)) { AnnounceProblem( c._original ); return false; } } formulaIndex++; } // go through additional constraints for(int k = 0; k < ESList.CTable.size(); k++) { node p = (node) (ESList.CTable.get(k)); node temp = p.simplify().cnf(); if(temp instanceof and) { ArrayList formulas = new ArrayList(); grammar.splitFormula(formulas, temp); for(int j = 0; j < formulas.size(); j++) { String _original = (String) grammar._originals.get(formulaIndex); clause c = new clause((node) formulas.get(j), null, _original); analyzeClause(c, c.n); // if clause is not satisfied, then spec is not complete if(!grammar.SATISFIED.equals(c.value)) { AnnounceProblem( c._original ); return false; } } } else { String _original = (String) grammar._originals.get(formulaIndex); clause c = new clause(temp, null, _original); analyzeClause(c, c.n); // if clause is not satisfied, then spec is not complete if(!grammar.SATISFIED.equals(c.value)) { AnnounceProblem( c.__original ); return false; } } formulaIndex++; } // all clauses are satisfied return true; } static void analyzeClause(clause c, node n) { if(n instanceof bterm) { variable v = (variable) (variable.Vtable.get(n.toString())); if(v.value == variable.T) { c.value = grammar.SATISFIED; return; } else { if(c.value == null) { c.value = grammar.VIOLATED; } } } else if(n instanceof not) { if(n.left != null) { variable v = (variable) (variable.Vtable.get((n.left).toString())); if(v.value == variable.T) { if(c.value == null) { c.value = grammar.VIOLATED; } } else { c.value = grammar.SATISFIED; return; } } } else // n instanceof or { if(n.left != null) { analyzeClause(c, n.left); } if(n.right != null) { analyzeClause(c, n.right); } } } }