aboutsummaryrefslogtreecommitdiff
path: root/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java
diff options
context:
space:
mode:
authorRncLsn <rnc.lsn@gmail.com>2015-05-13 11:57:06 +0100
committerRncLsn <rnc.lsn@gmail.com>2015-05-13 11:57:06 +0100
commit7e0ecc07285209e65f9d4d022065d06a4997fc86 (patch)
tree3c3faa6684e49444c7078903d2e5762fc44bb3a6 /src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java
parent0c2726db44b562cbda9bfa87e76d829927c31ec8 (diff)
downloadACQuA-7e0ecc07285209e65f9d4d022065d06a4997fc86.tar.gz
ACQuA-7e0ecc07285209e65f9d4d022065d06a4997fc86.zip
Implementing Limited Skolemisation, in particular SkolemTermsDispenser.
Diffstat (limited to 'src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java')
-rw-r--r--src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java138
1 files changed, 59 insertions, 79 deletions
diff --git a/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java b/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java
index b201918..70f841f 100644
--- a/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java
+++ b/src/uk/ac/ox/cs/pagoda/constraints/PredicateDependency.java
@@ -1,155 +1,135 @@
1package uk.ac.ox.cs.pagoda.constraints; 1package uk.ac.ox.cs.pagoda.constraints;
2 2
3import java.util.Collection; 3import org.semanticweb.HermiT.model.*;
4import java.util.HashMap; 4import uk.ac.ox.cs.pagoda.rules.approximators.OverApproxExist;
5import java.util.HashSet;
6import java.util.LinkedList;
7import java.util.Map;
8import java.util.Queue;
9import java.util.Set;
10
11import org.semanticweb.HermiT.model.AnnotatedEquality;
12import org.semanticweb.HermiT.model.AtLeastConcept;
13import org.semanticweb.HermiT.model.AtLeastDataRange;
14import org.semanticweb.HermiT.model.Atom;
15import org.semanticweb.HermiT.model.AtomicConcept;
16import org.semanticweb.HermiT.model.AtomicNegationConcept;
17import org.semanticweb.HermiT.model.AtomicRole;
18import org.semanticweb.HermiT.model.DLClause;
19import org.semanticweb.HermiT.model.DLPredicate;
20import org.semanticweb.HermiT.model.Equality;
21import org.semanticweb.HermiT.model.Inequality;
22import org.semanticweb.HermiT.model.InverseRole;
23
24import uk.ac.ox.cs.pagoda.rules.OverApproxExist;
25import uk.ac.ox.cs.pagoda.util.Namespace; 5import uk.ac.ox.cs.pagoda.util.Namespace;
26import uk.ac.ox.cs.pagoda.util.Utility; 6import uk.ac.ox.cs.pagoda.util.Utility;
27 7
8import java.util.*;
9
28 10
29public class PredicateDependency extends DependencyGraph<DLPredicate> { 11public class PredicateDependency extends DependencyGraph<DLPredicate> {
30 12
31 Collection<DLClause> m_clauses; 13 private static final DLPredicate equality = AtomicRole.create(Namespace.EQUALITY);
32 Map<PredicatePair, LinkedList<DLClause>> edgeLabels = new HashMap<PredicatePair, LinkedList<DLClause>>(); 14 private static final DLPredicate inequality = AtomicRole.create(Namespace.INEQUALITY);
33 15 Collection<DLClause> m_clauses;
16 Map<PredicatePair, LinkedList<DLClause>> edgeLabels = new HashMap<PredicatePair, LinkedList<DLClause>>();
17 Set<DLPredicate> reachableToBottom = null;
18
34 public PredicateDependency(Collection<DLClause> clauses) { 19 public PredicateDependency(Collection<DLClause> clauses) {
35 m_clauses = clauses; 20 m_clauses = clauses;
36 build(); 21 build();
37 } 22 }
38 23
39 @Override 24 @Override
40 protected void build() { 25 protected void build() {
41 update(m_clauses); 26 update(m_clauses);
42 27
43 addLink(equality, AtomicConcept.NOTHING); 28 addLink(equality, AtomicConcept.NOTHING);
44 addLink(inequality, AtomicConcept.NOTHING); 29 addLink(inequality, AtomicConcept.NOTHING);
45 } 30 }
46 31
47 private void addEdgeLabel(DLPredicate body, DLPredicate head, DLClause clause) { 32 private void addEdgeLabel(DLPredicate body, DLPredicate head, DLClause clause) {
48 PredicatePair key = new PredicatePair(body, head); 33 PredicatePair key = new PredicatePair(body, head);
49 LinkedList<DLClause> value; 34 LinkedList<DLClause> value;
50 if ((value = edgeLabels.get(key)) == null) 35 if ((value = edgeLabels.get(key)) == null)
51 edgeLabels.put(key, value = new LinkedList<DLClause>()); 36 edgeLabels.put(key, value = new LinkedList<DLClause>());
52 value.add(clause); 37 value.add(clause);
53 } 38 }
54 39
55 private void addLinks4Negation(AtomicConcept c, DLClause clause) { 40 private void addLinks4Negation(AtomicConcept c, DLClause clause) {
56 addLink(c, AtomicConcept.NOTHING); 41 addLink(c, AtomicConcept.NOTHING);
57 addEdgeLabel(c, AtomicConcept.NOTHING, clause); 42 addEdgeLabel(c, AtomicConcept.NOTHING, clause);
58 String iri = c.getIRI(); 43 String iri = c.getIRI();
59 addLink(c = AtomicConcept.create(iri.substring(0, iri.length() - 4)), AtomicConcept.NOTHING); 44 addLink(c = AtomicConcept.create(iri.substring(0, iri.length() - 4)), AtomicConcept.NOTHING);
60 addEdgeLabel(c, AtomicConcept.NOTHING, clause); 45 addEdgeLabel(c, AtomicConcept.NOTHING, clause);
61 } 46 }
62 47
63 public Set<DLPredicate> collectPredicate(Atom[] atoms) { 48 public Set<DLPredicate> collectPredicate(Atom[] atoms) {
64 Set<DLPredicate> predicates = new HashSet<DLPredicate>(); 49 Set<DLPredicate> predicates = new HashSet<DLPredicate>();
65 for (Atom atom: atoms) 50 for (Atom atom : atoms)
66 predicates.addAll(getAtomicPredicates(atom.getDLPredicate())); 51 predicates.addAll(getAtomicPredicates(atom.getDLPredicate()));
67 return predicates; 52 return predicates;
68 } 53 }
69
70 private static final DLPredicate equality = AtomicRole.create(Namespace.EQUALITY);
71 private static final DLPredicate inequality = AtomicRole.create(Namespace.INEQUALITY);
72 54
73 private Set<DLPredicate> getAtomicPredicates(DLPredicate predicate) { 55 private Set<DLPredicate> getAtomicPredicates(DLPredicate predicate) {
74 Set<DLPredicate> predicates = new HashSet<DLPredicate>(); 56 Set<DLPredicate> predicates = new HashSet<DLPredicate>();
75 if (predicate instanceof AtLeastConcept) 57 if (predicate instanceof AtLeastConcept)
76 predicates.addAll(getAtomicPredicates((AtLeastConcept) predicate)); 58 predicates.addAll(getAtomicPredicates((AtLeastConcept) predicate));
77 else { 59 else {
78 if ((predicate = getAtomicPredicate(predicate)) != null) 60 if ((predicate = getAtomicPredicate(predicate)) != null)
79 predicates.add(predicate); 61 predicates.add(predicate);
80 } 62 }
81 return predicates; 63 return predicates;
82 } 64 }
83 65
84 private Set<DLPredicate> getAtomicPredicates(AtLeastConcept alc) { 66 private Set<DLPredicate> getAtomicPredicates(AtLeastConcept alc) {
85 Set<DLPredicate> set = new HashSet<DLPredicate>(); 67 Set<DLPredicate> set = new HashSet<DLPredicate>();
86 if (alc.getOnRole() instanceof AtomicRole) 68 if (alc.getOnRole() instanceof AtomicRole)
87 set.add((AtomicRole) alc.getOnRole()); 69 set.add((AtomicRole) alc.getOnRole());
88 else 70 else
89 set.add(((InverseRole) alc.getOnRole()).getInverseOf()); 71 set.add(((InverseRole) alc.getOnRole()).getInverseOf());
90 72
91 if (alc.getToConcept() instanceof AtomicConcept) 73 if (alc.getToConcept() instanceof AtomicConcept)
92 if (alc.getToConcept().equals(AtomicConcept.THING)); 74 if (alc.getToConcept().equals(AtomicConcept.THING)) ;
93 else set.add((AtomicConcept) alc.getToConcept()); 75 else set.add((AtomicConcept) alc.getToConcept());
94 else 76 else
95 set.add(OverApproxExist.getNegationConcept(((AtomicNegationConcept) alc.getToConcept()).getNegatedAtomicConcept())); 77 set.add(OverApproxExist.getNegationConcept(((AtomicNegationConcept) alc.getToConcept()).getNegatedAtomicConcept()));
96 return set; 78 return set;
97 } 79 }
98 80
99 private DLPredicate getAtomicPredicate(DLPredicate p) { 81 private DLPredicate getAtomicPredicate(DLPredicate p) {
100 if (p instanceof Equality || p instanceof AnnotatedEquality) 82 if (p instanceof Equality || p instanceof AnnotatedEquality)
101 return equality; 83 return equality;
102 if (p instanceof Inequality) 84 if (p instanceof Inequality)
103 return inequality; 85 return inequality;
104 if (p instanceof AtomicConcept) 86 if (p instanceof AtomicConcept)
105 if (p.equals(AtomicConcept.THING)) 87 if (p.equals(AtomicConcept.THING))
106 return null; 88 return null;
107 else return p; 89 else return p;
108 if (p instanceof AtomicRole) 90 if (p instanceof AtomicRole)
109 return p; 91 return p;
110 if (p instanceof AtLeastDataRange) { 92 if (p instanceof AtLeastDataRange) {
111 AtLeastDataRange aldr = (AtLeastDataRange) p; 93 AtLeastDataRange aldr = (AtLeastDataRange) p;
112 if (aldr.getOnRole() instanceof AtomicRole) 94 if (aldr.getOnRole() instanceof AtomicRole)
113 return (AtomicRole) aldr.getOnRole(); 95 return (AtomicRole) aldr.getOnRole();
114 else 96 else
115 return ((InverseRole) aldr.getOnRole()).getInverseOf(); 97 return ((InverseRole) aldr.getOnRole()).getInverseOf();
116 } 98 }
117 Utility.logDebug("Unknown DLPredicate in PredicateDependency: " + p); 99 Utility.logDebug("Unknown DLPredicate in PredicateDependency: " + p);
118 return null; 100 return null;
119 } 101 }
120 102
121 public Set<DLClause> pathTo(DLPredicate p) { 103 public Set<DLClause> pathTo(DLPredicate p) {
122 Set<DLClause> rules = new HashSet<DLClause>(); 104 Set<DLClause> rules = new HashSet<DLClause>();
123 Set<DLPredicate> visited = new HashSet<DLPredicate>(); 105 Set<DLPredicate> visited = new HashSet<DLPredicate>();
124 106
125 Queue<DLPredicate> queue = new LinkedList<DLPredicate>(); 107 Queue<DLPredicate> queue = new LinkedList<DLPredicate>();
126 queue.add(p); 108 queue.add(p);
127 visited.add(p); 109 visited.add(p);
128 110
129 Set<DLPredicate> edge; 111 Set<DLPredicate> edge;
130 Collection<DLClause> clauses; 112 Collection<DLClause> clauses;
131 113
132 while (!queue.isEmpty()) { 114 while (!queue.isEmpty()) {
133 if ((edge = reverseEdges.get(p = queue.poll())) != null) { 115 if ((edge = reverseEdges.get(p = queue.poll())) != null) {
134 for (DLPredicate pred: edge) { 116 for (DLPredicate pred: edge) {
135 if (!visited.contains(pred)) { 117 if (!visited.contains(pred)) {
136 queue.add(pred); 118 queue.add(pred);
137 visited.add(pred); 119 visited.add(pred);
138 } 120 }
139 clauses = edgeLabelsBetween(pred, p); 121 clauses = edgeLabelsBetween(pred, p);
140 if (clauses != null) rules.addAll(clauses); 122 if (clauses != null) rules.addAll(clauses);
141 } 123 }
142 } 124 }
143 } 125 }
144 return rules; 126 return rules;
145 } 127 }
146 128
147 private LinkedList<DLClause> edgeLabelsBetween(DLPredicate p, DLPredicate q) { 129 private LinkedList<DLClause> edgeLabelsBetween(DLPredicate p, DLPredicate q) {
148 PredicatePair pair = new PredicatePair(p, q); 130 PredicatePair pair = new PredicatePair(p, q);
149 return edgeLabels.get(pair); 131 return edgeLabels.get(pair);
150 } 132 }
151
152 Set<DLPredicate> reachableToBottom = null;
153 133
154 public Set<DLClause> pathToBottom(DLPredicate p) { 134 public Set<DLClause> pathToBottom(DLPredicate p) {
155 if (reachableToBottom == null) { 135 if (reachableToBottom == null) {