aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/rules/OverApproxDisj.java103
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 @@
1package uk.ac.ox.cs.pagoda.rules;
2
3import java.util.Collection;
4import java.util.HashMap;
5import java.util.HashSet;
6import java.util.LinkedList;
7import java.util.Map;
8import java.util.Set;
9
10import org.semanticweb.HermiT.model.Atom;
11import org.semanticweb.HermiT.model.DLClause;
12import org.semanticweb.HermiT.model.DLPredicate;
13import org.semanticweb.HermiT.model.Term;
14import org.semanticweb.HermiT.model.Variable;
15
16import uk.ac.ox.cs.pagoda.hermit.DLClauseHelper;
17
18public 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}