diff options
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java')
| -rw-r--r-- | src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java b/src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java new file mode 100644 index 0000000..5edb08e --- /dev/null +++ b/src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java | |||
| @@ -0,0 +1,103 @@ | |||
| 1 | package uk.ac.ox.cs.pagoda.rules; | ||
| 2 | |||
| 3 | import java.util.Collection; | ||
| 4 | import java.util.HashMap; | ||
| 5 | import java.util.HashSet; | ||
| 6 | import java.util.LinkedList; | ||
| 7 | import java.util.Map; | ||
| 8 | import java.util.Set; | ||
| 9 | |||
| 10 | import org.semanticweb.HermiT.model.Atom; | ||
| 11 | import org.semanticweb.HermiT.model.DLClause; | ||
| 12 | import org.semanticweb.HermiT.model.DLPredicate; | ||
| 13 | import org.semanticweb.HermiT.model.Term; | ||
| 14 | import org.semanticweb.HermiT.model.Variable; | ||
| 15 | |||
| 16 | import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper; | ||
| 17 | |||
| 18 | public class OverApproxDisj implements Approximator { | ||
| 19 | |||
| 20 | @Override | ||
| 21 | public Collection<DLClause> convert(DLClause clause, DLClause originalClause) { | ||
| 22 | LinkedList<DLClause> distincts = new LinkedList<DLClause>(); | ||
| 23 | Atom[] headAtoms = clause.getHeadAtoms(), bodyAtoms = clause.getBodyAtoms(); | ||
| 24 | LinkedList<DLClause> newClauses = new LinkedList<DLClause>(); | ||
| 25 | DLClause newClause; | ||
| 26 | if (headAtoms.length > 1) { | ||
| 27 | for (Atom headAtom: headAtoms) { | ||
| 28 | newClause = DLClause.create(new Atom[] {headAtom}, bodyAtoms); | ||
| 29 | newClauses.add(newClause); | ||
| 30 | // distincts.add(newClause); | ||
| 31 | } | ||
| 32 | |||
| 33 | for (DLClause cls: newClauses) { | ||
| 34 | newClause = DLClauseHelper.simplified(cls); | ||
| 35 | if (!isSubsumedBy(newClause, distincts)) | ||
| 36 | distincts.add(newClause); | ||
| 37 | } | ||
| 38 | } | ||
| 39 | else distincts.add(clause); | ||
| 40 | |||
| 41 | return distincts; | ||
| 42 | } | ||
| 43 | |||
| 44 | public static boolean isSubsumedBy(DLClause newClause, Collection<DLClause> distinctClauses) { | ||
| 45 | Map<Variable, Term> unifier; | ||
| 46 | Set<Atom> bodyAtoms = new HashSet<Atom>(); | ||
| 47 | for (DLClause clause: distinctClauses) { | ||
| 48 | if (newClause.getHeadLength() > 0 && clause.getHeadLength() > 0 && | ||
| 49 | (unifier = isSubsumedBy(newClause.getHeadAtom(0), clause.getHeadAtom(0))) == null) | ||
| 50 | continue; | ||
| 51 | else | ||
| 52 | unifier = new HashMap<Variable, Term>(); | ||
| 53 | |||
| 54 | for (Atom atom: clause.getBodyAtoms()) | ||
| 55 | bodyAtoms.add(rename(atom, unifier)); | ||
| 56 | unifier.clear(); | ||
| 57 | |||
| 58 | for (Atom atom: newClause.getBodyAtoms()) | ||
| 59 | if (!bodyAtoms.contains(atom)) | ||
| 60 | continue; | ||
| 61 | |||
| 62 | return true; | ||
| 63 | } | ||
| 64 | |||
| 65 | return false; | ||
| 66 | } | ||
| 67 | |||
| 68 | public static Map<Variable, Term> isSubsumedBy(Atom atom1, Atom atom2) { | ||
| 69 | DLPredicate predicate = atom1.getDLPredicate(); | ||
| 70 | if (!predicate.equals(atom2.getDLPredicate())) | ||
| 71 | return null; | ||
| 72 | |||
| 73 | Map<Variable, Term> unifier = new HashMap<Variable, Term>(); | ||
| 74 | Term term1, term2; | ||
| 75 | for (int index = 0; index < predicate.getArity(); ++index) { | ||
| 76 | term1 = rename(atom1.getArgument(index), unifier); | ||
| 77 | term2 = rename(atom2.getArgument(index), unifier); | ||
| 78 | |||
| 79 | if (term1.equals(term2)); | ||
| 80 | else if (term1 instanceof Variable) | ||
| 81 | unifier.put((Variable) term1, term2); | ||
| 82 | else | ||
| 83 | return null; | ||
| 84 | } | ||
| 85 | return unifier; | ||
| 86 | } | ||
| 87 | |||
| 88 | public static Atom rename(Atom atom, Map<Variable, Term> unifier) { | ||
| 89 | Term[] arguments = new Term[atom.getArity()]; | ||
| 90 | for (int i = 0; i < atom.getArity(); ++i) | ||
| 91 | arguments[i] = rename(atom.getArgument(i), unifier); | ||
| 92 | return Atom.create(atom.getDLPredicate(), arguments); | ||
| 93 | } | ||
| 94 | |||
| 95 | public static Term rename(Term argument, Map<Variable, Term> unifier) { | ||
| 96 | Term newArg; | ||
| 97 | while ((newArg = unifier.get(argument)) != null) | ||
| 98 | return newArg; | ||
| 99 | return argument; | ||
| 100 | } | ||
| 101 | |||
| 102 | |||
| 103 | } | ||
