00001 package edu.tum.cs.logic.sat;
00002
00003 import java.util.Iterator;
00004 import java.util.Vector;
00005
00006 import edu.tum.cs.logic.Conjunction;
00007 import edu.tum.cs.logic.Formula;
00008 import edu.tum.cs.logic.TrueFalse;
00009 import edu.tum.cs.logic.sat.Clause.TautologyException;
00010
00011 public class ClausalKB implements Iterable<Clause> {
00012
00013 protected Vector<Clause> clauses;
00014
00020 public ClausalKB(edu.tum.cs.logic.KnowledgeBase kb) throws Exception {
00021
00022 this();
00023 for(Formula f : kb)
00024 addFormula(f);
00025 }
00026
00030 public ClausalKB() {
00031 clauses = new Vector<Clause>();
00032 }
00033
00039 public void addFormula(Formula f) throws Exception {
00040
00041 f = f.toCNF();
00042
00043 if(f instanceof Conjunction) {
00044 Conjunction c = (Conjunction)f;
00045 for(Formula child : c.children) {
00046 try {
00047 clauses.add(new Clause(child));
00048 }
00049 catch(TautologyException e) {}
00050 }
00051 }
00052 else {
00053 if(f instanceof edu.tum.cs.logic.TrueFalse) {
00054 if(!((TrueFalse)f).isTrue())
00055 throw new Exception("Knowledge base is unsatisfiable!");
00056 }
00057 else {
00058 try {
00059 clauses.add(new Clause(f));
00060 }
00061 catch(TautologyException e) {}
00062 }
00063 }
00064 }
00065
00066 public Iterator<Clause> iterator() {
00067 return clauses.iterator();
00068 }
00069
00070 public int size() {
00071 return clauses.size();
00072 }
00073
00074 public void print() {
00075 int i = 0;
00076 for(Clause c : this) {
00077 System.out.printf("%4d %s\n", ++i, c.toString());
00078 }
00079 }
00080 }