forked from dice-group/owlapy
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_ce_simplifier.py
More file actions
374 lines (342 loc) · 32.2 KB
/
Copy pathtest_ce_simplifier.py
File metadata and controls
374 lines (342 loc) · 32.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
import unittest
from owlapy import dl_to_owl_expression, owl_expression_to_dl
from owlapy.class_expression import OWLObjectHasValue, OWLObjectSomeValuesFrom, OWLObjectOneOf, OWLObjectUnionOf, \
OWLObjectIntersectionOf, OWLObjectMinCardinality
from owlapy.iri import IRI
from owlapy.owl_individual import OWLNamedIndividual
from owlapy.owl_property import OWLObjectProperty
from owlapy.owl_reasoner import StructuralReasoner, SyncReasoner
from owlapy.utils import simplify_class_expression
class TestSimplifier(unittest.TestCase):
ns = "http://example.org/"
def test_repetition_removal(self):
ce1 = "A ⊓ C ⊓ A" # ==> "A ⊓ C"
ce2 = "A ⊔ C ⊔ A ⊔ C" # ==> "A ⊔ C"
ce3 = "A ⊓ C ⊓ A ⊓ A ⊓ A" # ==> "A ⊓ C"
ce4 = "A ⊓ A ⊔ A" # ==> "A"
ce5 = "A ⊓ C ⊓ (A ⊓ A ⊔ A)" # ==> "A ⊓ C"
ce6 = "A ⊓ (B ⊔ C) ⊓ (B ⊔ C)" # ==> "A ⊓ (B ⊔ C)"
ce7 = "A ⊓ (∀r1.B ⊔ ¬C) ⊓ (∀r1.B ⊔ ¬C)" # ==> "A ⊓ (∀r1.B ⊔ ¬C)"
ce8 = "A ⊓ (B ⊔ C) ⊓ (B ⊔ C) ⊓ (B ⊔ C) ⊓ (B ⊔ C)" # ==> "A ⊓ (B ⊔ C)"
ce9 = "((B ⊔ C) ⊓ (B ⊔ C)) ⊔ ((B ⊔ C) ⊓ (B ⊔ C))" # ==> "B ⊔ C"
ce10 = "A ⊔ (B ⊓ C) ⊔ A" # ==> "A ⊔ (B ⊓ C)"
ce11 = "(A ⊓ B) ⊔ (A ⊓ B) ⊔ C" # ==> "(A ⊓ B) ⊔ C"
ce12 = "(A ⊓ (B ⊔ C)) ⊓ (A ⊓ (B ⊔ C))" # ==> "A ⊓ (B ⊔ C)"
ce13 = "(A ⊓ B) ⊓ (B ⊓ A)" # ==> "A ⊓ B"
ce14 = "(∀r.A ⊓ ∃s.B) ⊓ (∃s.B ⊓ ∀r.A)" # ==> "(∃ s.B) ⊓ (∀ r.A)"
ce15 = "(A ⊔ B) ⊓ (A ⊔ B) ⊔ C ⊔ (A ⊔ B)" # ==> "A ⊔ B ⊔ C"
ce16 = "((A ⊓ B) ⊔ C) ⊔ ((A ⊓ B) ⊔ C)" # ==> "C ⊔ (A ⊓ B)"
ce17 = "A ⊓ (B ⊔ C ⊔ B ⊔ C) ⊓ A ⊓ (B ⊔ C)" # ==> "A ⊓ (B ⊔ C)"
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce1, self.ns)),
dl_to_owl_expression("A ⊓ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce2, self.ns)),
dl_to_owl_expression("A ⊔ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce3, self.ns)),
dl_to_owl_expression("A ⊓ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce4, self.ns)),
dl_to_owl_expression("A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce5, self.ns)),
dl_to_owl_expression("A ⊓ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce6, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce7, self.ns)),
dl_to_owl_expression("A ⊓ ((¬C) ⊔ (∀ r1.B))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce8, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce9, self.ns)),
dl_to_owl_expression("B ⊔ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce10, self.ns)),
dl_to_owl_expression("A ⊔ (B ⊓ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce11, self.ns)),
dl_to_owl_expression("C ⊔ (A ⊓ B)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce12, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce13, self.ns)),
dl_to_owl_expression("A ⊓ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce14, self.ns)),
dl_to_owl_expression("(∃ s.B) ⊓ (∀ r.A)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce15, self.ns)),
dl_to_owl_expression("A ⊔ B ⊔ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce16, self.ns)),
dl_to_owl_expression("C ⊔ (A ⊓ B)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce17, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
def test_nnf(self):
ce1 = "¬(¬A)" # ==> "A"
ce2 = "¬(¬(¬C))" # ==> "¬C"
ce3 = "¬(A ⊓ B)" # ==> "(¬A) ⊔ (¬B)"
ce4 = "¬(A ⊔ B)" # ==> "(¬A) ⊓ (¬B)"
ce5 = "¬(∀ r.C)" # ==> "∃ r.(¬C)"
ce6 = "¬(∃ r.C)" # ==> "∀ r.(¬C)"
ce7 = "¬⊤" # ==> "⊥"
ce8 = "¬⊥" # ==> "⊤"
ce9 = "¬(A ⊓ (B ⊔ C))" # ==> "(¬A) ⊔ ((¬B) ⊓ (¬C))"
ce10 = "¬((A ⊓ B) ⊔ C)" # ==> "(¬C) ⊓ ((¬A) ⊔ (¬B))"
ce11 = "¬(∀ r.(A ⊓ B))" # ==> "∃ r.((¬A) ⊔ (¬B))"
ce12 = "¬(∃ r.(A ⊔ B))" # ==> "∀ r.((¬A) ⊓ (¬B))"
ce13 = "¬(∀ r.∃ s.A)" # ==> "∃ r.(∀ s.(¬A))"
ce14 = "¬(∃ r.∀ s.B)" # ==> "∀ r.(∃ s.(¬B))"
ce15 = "¬(¬(A ⊔ ¬B))" # ==> "A ⊔ (¬B)"
ce16 = "¬((∀ r.A) ⊓ (∃ s.B))" # ==> "(∀ s.(¬B)) ⊔ (∃ r.(¬A))"
ce17 = "¬((∃ r.A) ⊔ (∀ s.B))" # ==> "(∀ r.(¬A)) ⊓ (∃ s.(¬B))"
ce18 = "¬(∀ r.(A ⊔ ∃ s.B))" # ==> "∃ r.((¬A) ⊓ (∀ s.(¬B)))"
ce19 = "¬(∃ r.(A ⊓ ∀ s.B))" # ==> "∀ r.((¬A) ⊔ (∃ s.(¬B)))"
ce20 = "¬((A ⊓ B) ⊔ (∀ r.C))" # ==> "((¬A) ⊔ (¬B)) ⊓ (∃ r.(¬C))"
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce1, self.ns)),
dl_to_owl_expression("A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce2, self.ns)),
dl_to_owl_expression("¬C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce3, self.ns)),
dl_to_owl_expression("(¬A) ⊔ (¬B)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce4, self.ns)),
dl_to_owl_expression("(¬A) ⊓ (¬B)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce5, self.ns)),
dl_to_owl_expression("∃ r.(¬C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce6, self.ns)),
dl_to_owl_expression("∀ r.(¬C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce7, self.ns)),
dl_to_owl_expression("⊥", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce8, self.ns)),
dl_to_owl_expression("⊤", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce9, self.ns)),
dl_to_owl_expression("((¬B) ⊓ (¬C)) ⊔ (¬A)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce10, self.ns)),
dl_to_owl_expression("((¬A) ⊔ (¬B)) ⊓ (¬C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce11, self.ns)),
dl_to_owl_expression("∃ r.((¬A) ⊔ (¬B))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce12, self.ns)),
dl_to_owl_expression("∀ r.((¬A) ⊓ (¬B))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce13, self.ns)),
dl_to_owl_expression("∃ r.(∀ s.(¬A))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce14, self.ns)),
dl_to_owl_expression("∀ r.(∃ s.(¬B))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce15, self.ns)),
dl_to_owl_expression("A ⊔ (¬B)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce16, self.ns)),
dl_to_owl_expression("(∃ r.(¬A)) ⊔ (∀ s.(¬B))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce17, self.ns)),
dl_to_owl_expression("(∃ s.(¬B)) ⊓ (∀ r.(¬A))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce18, self.ns)),
dl_to_owl_expression("∃ r.((¬A) ⊓ (∀ s.(¬B)))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce19, self.ns)),
dl_to_owl_expression("∀ r.((¬A) ⊔ (∃ s.(¬B)))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce20, self.ns)),
dl_to_owl_expression("((¬A) ⊔ (¬B)) ⊓ (∃ r.(¬C))", self.ns))
def test_absorption_law(self):
ce1 = "A ⊔ (A ⊓ B)" # ==> "A"
ce2 = "A ⊓ (A ⊓ B)" # ==> "A"
ce3 = "A ⊓ (B ⊔ (A ⊓ B))" # ==> "A ⊓ B"
ce4 = "A ⊔ (A ⊓ (B ⊔ C))" # ==> "A"
ce5 = "(A ⊓ B) ⊔ (A ⊓ (B ⊔ C))" # ==> "A ⊓ (B ⊔ C)"
ce6 = "(A ⊔ B) ⊓ (A ⊔ (B ⊓ C))" # ==> "A ⊔ (B ⊓ C)"
ce7 = "A ⊔ (A ⊓ ∃r.B)" # ==> "A"
ce8 = "((∀r.A ⊓ ∃r.A) ⊔ ∀r.A)" # ==> "∀ r.A"
ce9 = "A ⊓ (B ⊔ (A ⊓ C))" # ==> "A ⊓ (B ⊔ C)"
ce10 = "(A ⊓ (B ⊔ A)) ⊔ C" # ==> "A ⊔ C"
ce11 = "(A ⊔ (B ⊓ A)) ⊓ D" # ==> "A ⊓ D"
ce12 = "(A ⊔ B) ⊓ ((A ⊔ B) ⊔ C)" # ==> "A ⊔ B"
ce13 = "((A ⊔ (B ⊓ C)) ⊓ (A ⊔ B)) ⊓ (A ⊔ (B ⊓ C))" # ==> "A ⊔ (B ⊓ C)"
ce14 = "A ⊓ (B ⊔ (A ⊓ ((A ⊔ (B ⊓ C)) ⊓ (A ⊔ B)) ⊓ (A ⊔ (B ⊓ C))))" # ==> "A"
ce15 = "A ⊓ ((A ⊔ (E ⊔ D)) ⊓ B)"
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce1, self.ns)),
dl_to_owl_expression("A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce2, self.ns)),
dl_to_owl_expression("A ⊓ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce3, self.ns)),
dl_to_owl_expression("A ⊓ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce4, self.ns)),
dl_to_owl_expression("A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce5, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce6, self.ns)),
dl_to_owl_expression("A ⊔ (B ⊓ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce7, self.ns)),
dl_to_owl_expression("A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce8, self.ns)),
dl_to_owl_expression("∀ r.A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce9, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce10, self.ns)),
dl_to_owl_expression("A ⊔ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce11, self.ns)),
dl_to_owl_expression("A ⊓ D", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce12, self.ns)),
dl_to_owl_expression("A ⊔ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce13, self.ns)),
dl_to_owl_expression("A ⊔ (B ⊓ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce14, self.ns)),
dl_to_owl_expression("A", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce15, self.ns)),
dl_to_owl_expression("A ⊓ B", self.ns))
def test_simplification_through_factorization(self):
ce1 = "(A ⊓ B) ⊔ (A ⊓ B)" # ==> "A ⊓ B"
ce2 = "(A ⊓ B) ⊔ (A ⊓ C)" # ==> "A ⊓ (B ⊔ C)"
ce3 = "(A ⊔ B) ⊓ (A ⊔ B)" # ==> "A ⊓ B"
ce4 = "(A ⊔ B) ⊓ (A ⊔ C)" # ==> "A ⊔ (B ⊓ C)"
ce5 = "(A ⊔ B) ⊓ (C ⊔ E)" # ==> "(A ⊔ B) ⊓ (C ⊔ E)" (same)
ce6 = "((∀ r.A) ⊓ (∃ r.B)) ⊔ ((∀ r.B) ⊓ (∃ r.A))" # ==> "((∃ r.A) ⊓ (∀ r.B)) ⊔ ((∃ r.B) ⊓ (∀ r.A))" (same)
ce7 = "(A ⊓ B) ⊔ (A ⊓ B ⊓ E)" # ==> "A ⊓ B"
ce8 = "(A ⊓ B) ⊓ (A ⊓ (B ⊓ (C ⊔ E)))" # ==> "A ⊓ B ⊓ (C ⊔ E)"
ce9 = "(A ⊓ B) ⊓ (C ⊓ (B ⊔ (C ⊔ E)))" # ==> "A ⊓ B ⊓ C"
ce10 = "(∀r_2.⊥) ⊓ (∀r_2.¬C)" # ==> ∀ r_2.(⊥ ⊓ (¬C)) ==> "∀ r_2.⊥"
ce11 = "(∀r_1.∀r_2.∀r_3.⊥) ⊓ (∀r_1.∀r_2.¬C)" # ==> "∀ r_1.(∀ r_2.((¬C) ⊓ (∀ r_3.⊥)))"
ce12 = "(∀r_1.∀r_2.∀r_3.(¬⊥ ⊔ B ⊔ E)) ⊓ (∀r_1.∀r_2.¬(C ⊔ (C ⊓ B)))" # ==> "∀ r_1.(∀ r_2.((¬C) ⊓ (∀ r_3.⊤)))"
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce1, self.ns)),
dl_to_owl_expression("A ⊓ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce2, self.ns)),
dl_to_owl_expression("A ⊓ (B ⊔ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce3, self.ns)),
dl_to_owl_expression("A ⊔ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce4, self.ns)),
dl_to_owl_expression("A ⊔ (B ⊓ C)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce5, self.ns)),
dl_to_owl_expression("(A ⊔ B) ⊓ (C ⊔ E)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce6, self.ns)),
dl_to_owl_expression("((∃ r.A) ⊓ (∀ r.B)) ⊔ ((∃ r.B) ⊓ (∀ r.A))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce7, self.ns)),
dl_to_owl_expression("A ⊓ B", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce8, self.ns)),
dl_to_owl_expression("A ⊓ B ⊓ (C ⊔ E)", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce9, self.ns)),
dl_to_owl_expression("A ⊓ B ⊓ C", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce10, self.ns)),
dl_to_owl_expression("∀ r_2.⊥", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce11, self.ns)),
dl_to_owl_expression("∀ r_1.(∀ r_2.((¬C) ⊓ (∀ r_3.⊥)))", self.ns))
self.assertEqual(simplify_class_expression(dl_to_owl_expression(ce12, self.ns)),
dl_to_owl_expression("∀ r_1.(∀ r_2.((¬C) ⊓ (∀ r_3.⊤)))", self.ns))
def test_other_stuff(self):
ce1 = "A ⊔ (¬A)" # ==> ⊤ (Law of the excluded middle)
ce2 = "A ⊓ (¬A)" # ==> ⊥ (Law of non-contradiction)
ce3 = "¬(A ⊓ (¬A))" # ==> ⊤
ce4 = "¬(A ⊔ (¬A))" # ==> ⊥
self.assertEqual("⊤",owl_expression_to_dl(simplify_class_expression(dl_to_owl_expression(ce1, self.ns))))
self.assertEqual("⊥",owl_expression_to_dl(simplify_class_expression(dl_to_owl_expression(ce2, self.ns))))
self.assertEqual("⊤",owl_expression_to_dl(simplify_class_expression(dl_to_owl_expression(ce3, self.ns))))
self.assertEqual('⊥',owl_expression_to_dl(simplify_class_expression(dl_to_owl_expression(ce4, self.ns))))
def test_simplifier_robustness(self):
# use reasoner to check if instances of simplified(C) == instances of C
family_reasoner = StructuralReasoner("KGs/Family/family-benchmark_rich_background.owl")
carcino_reasoner = StructuralReasoner("KGs/Carcinogenesis/carcinogenesis.owl")
carcino_syncreasoner = SyncReasoner("KGs/Carcinogenesis/carcinogenesis.owl")
NS = "http://www.benchmark.org/family#"
ns_carcino = "http://dl-learner.org/carcinogenesis#"
# Family class expressions
ce1 = "Child ⊓ Brother ⊓ Child ⊓ Child ⊓ Brother" # ==> "Child ⊓ Brother"
ce2 = "((Father ⊔ Brother) ⊓ (Father ⊔ Brother)) ⊔ ((Father ⊔ Brother) ⊓ (Father ⊔ Brother))" # ==> "Father ⊔ Brother"
ce3 = "(∀hasChild.Male ⊓ ∃married.Female) ⊓ (∃married.Female ⊓ ∀hasChild.Male)" # ==> "(∃ married.Female) ⊓ (∀ hasChild.Male)"
ce4 = "¬((∀ hasChild.Male) ⊓ (∃ married.Female))" # ==> "(∀ married.(¬Female)) ⊔ (∃ hasChild.(¬Male))"
ce5 = "(∀married.∀hasChild.∀hasSibling.(¬⊥ ⊔ Female ⊔ Male)) ⊓ (∀married.∀hasChild.¬(Daughter ⊔ (Daughter ⊓ Female)))" # ==> "∀ married.(∀ hasChild.((¬Daughter) ⊓ (∀ hasSibling.⊥)))"
ce6 = "¬(Male ⊓ (¬Male))" # ==> ⊤
ce7 = "¬(Male ⊔ (¬Male))" # ==> ⊥
ce8 = "(Male ⊓ Child) ⊓ (Male ⊓ (Child ⊓ (Son ⊔ Brother)))" # ==> "Male ⊓ Child ⊓ (Son ⊔ Brother)"
# Carcino class expressions
ce9 = "(∃ charge.xsd:double[≥ 0.1]) ⊓ (∃ charge.xsd:double[< 0.2])" # ==> ∃ charge.(xsd:double[< 0.2] ⊓ xsd:double[≥ 0.1])
ce10 = "∃ charge.xsd:integer[> 1 ⊓ > 2 ⊓ > 3]" # ==> ∃ charge.∃ charge.xsd:integer[> 3]
ce11 = "({d156_1 ⊔ d156_10 ⊔ d156_19}) ⊔ ({d156_11 ⊔ d156_10})" # ==> "{d156_1 ⊔ d156_10 ⊔ d156_19 ⊔ d156_11}"
ce12 = "({d156_1 ⊔ d156_10 ⊔ d156_19}) ⊓ ({d156_11 ⊔ d156_10})" # ==> "{d156_10}"
ce15 = "({d156_1 ⊔ d156_11 ⊔ d156_19}) ⊔ (({d156_11 ⊔ d156_1 ⊔ d156_10}) ⊓ Oxygen-50)" # ==> "{d156_1 ⊔ d156_11 ⊔ d156_19} ⊔ ({d156_10} ⊓ Oxygen-50)"
ce16 = "({d156_1 ⊔ d156_11 ⊔ d156_19}) ⊓ (({d156_11 ⊔ d156_1 ⊔ d156_10}) ⊓ Oxygen-50)" # ==> "({d156_11 ⊔ d156_1}) ⊓ (Oxygen-50)"
ce17 = "(∃ charge.xsd:double[≥ 0.1]) ⊓ (∃ charge.xsd:double[≥ 0.15])" # ==> ∃ charge.xsd:double[≥ 0.15]
ce18 = "(∃ charge.xsd:double[≥ 0.1]) ⊔ (∃ charge.xsd:double[≥ 0.15])" # ==> ∃ charge.xsd:double[≥ 0.1]
ce21 = "≤ 0 cytogen_ca.xsd:boolean ⊔ ≤ 2 cytogen_ca.xsd:boolean"
ce22 = "≤ 0 cytogen_ca.xsd:boolean ⊓ ≤ 2 cytogen_ca.xsd:boolean"
ce23 = "(((((((((((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (¬(∃ hasStructure.Ketone))) ⊓ (≥ 2 hasStructure.Methyl)) ⊔ (((((((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (¬(∃ hasStructure.Ketone))) ⊓ (¬(≥ 2 hasStructure.Methyl))) ⊓ (¬(∃ cytogen_sce.{false}))) ⊓ (¬(∃ hasStructure.Halide10))) ⊓ (¬(∃ mouse_lymph.{false}))) ⊓ (¬(∃ hasAtom.Chlorine-93))) ⊓ (∃ mouse_lymph.{true})) ⊓ (¬(∃ hasStructure.{six_ring-874})))) ⊔ ((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (∃ hasStructure.Ketone)) ⊓ (¬(≥ 4 hasStructure.Methyl))) ⊓ (∃ hasStructure.{ester-486}))) ⊔ (((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (∃ hasStructure.Ketone)) ⊓ (¬(≥ 4 hasStructure.Methyl))) ⊓ (¬(∃ hasStructure.{ester-486}))) ⊓ (∃ hasAtom.{d201_9}))) ⊔ ((((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (¬(∃ hasStructure.Ketone))) ⊓ (¬(≥ 2 hasStructure.Methyl))) ⊓ (∃ cytogen_sce.{false})) ⊓ (¬(∃ hasAtom.{d204_6}))) ⊓ (∃ hasBond.{bond317}))) ⊔ ((((∃ amesTestPositive.{true}) ⊓ (¬(∃ hasBond.{bond2415}))) ⊓ (¬(≥ 6 hasAtom.Chlorine-93))) ⊓ (¬(∃ hasBond.{bond3313})))) ⊔ ((((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (¬(∃ hasStructure.Ketone))) ⊓ (¬(≥ 2 hasStructure.Methyl))) ⊓ (¬(∃ cytogen_sce.{false}))) ⊓ (¬(∃ hasStructure.Halide10))) ⊓ (∃ mouse_lymph.{false}))) ⊔ (((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (∃ hasStructure.Ketone)) ⊓ (≥ 4 hasStructure.Methyl))) ⊔ (((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (¬(∃ hasStructure.Ketone))) ⊓ (¬(≥ 2 hasStructure.Methyl))) ⊓ (∃ cytogen_sce.{false})) ⊓ (∃ hasAtom.{d204_6}))) ⊔ (((¬(∃ amesTestPositive.{true})) ⊓ (∃ chromaberr.{false})) ⊓ (¬(∃ hasAtom.Titanium-134)))) ⊔ (((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (≥ 20 hasAtom.Hydrogen-3))) ⊔ (((((((¬(∃ amesTestPositive.{true})) ⊓ (¬(∃ chromaberr.{false}))) ⊓ (¬(≥ 20 hasAtom.Hydrogen-3))) ⊓ (¬(∃ hasStructure.Ketone))) ⊓ (¬(≥ 2 hasStructure.Methyl))) ⊓ (¬(∃ cytogen_sce.{false}))) ⊓ (∃ hasStructure.Halide10))"
ce23_simplified = "((((((((((((∃ hasAtom.{d204_6}) ⊓ (∃ cytogen_sce.{false})) ⊔ ((∃ hasStructure.Halide10) ⊓ (∀ cytogen_sce.¬{false})) ⊔ ((∀ hasStructure.(¬Halide10)) ⊓ (∃ mouse_lymph.{false}) ⊓ (∀ cytogen_sce.¬{false}))) ⊓ (≤ 1 hasStructure.Methyl)) ⊔ (≥ 2 hasStructure.Methyl)) ⊓ (∀ hasStructure.(¬Ketone))) ⊔ ((((∃ hasStructure.{ester-486}) ⊓ (≤ 3 hasStructure.Methyl)) ⊔ (≥ 4 hasStructure.Methyl)) ⊓ (∃ hasStructure.Ketone)) ⊔ ((∃ hasAtom.{d201_9}) ⊓ (∃ hasStructure.Ketone) ⊓ (∀ hasStructure.(¬{ester-486})) ⊓ (≤ 3 hasStructure.Methyl)) ⊔ ((∃ hasBond.{bond317}) ⊓ (∀ hasAtom.(¬{d204_6})) ⊓ (∀ hasStructure.(¬Ketone)) ⊓ (≤ 1 hasStructure.Methyl) ⊓ (∃ cytogen_sce.{false})) ⊔ ((∀ hasAtom.(¬Chlorine-93)) ⊓ (∀ hasStructure.((¬Halide10) ⊓ (¬Ketone) ⊓ (¬{six_ring-874}))) ⊓ (≤ 1 hasStructure.Methyl) ⊓ (∃ mouse_lymph.{true}) ⊓ (∀ cytogen_sce.¬{false}) ⊓ (∀ mouse_lymph.¬{false}))) ⊓ (≤ 19 hasAtom.Hydrogen-3)) ⊔ (≥ 20 hasAtom.Hydrogen-3)) ⊓ (∀ chromaberr.¬{false})) ⊔ ((∀ hasAtom.(¬Titanium-134)) ⊓ (∃ chromaberr.{false}))) ⊓ (∀ amesTestPositive.¬{true})) ⊔ ((∀ hasBond.(¬{bond2415})) ⊓ (∀ hasBond.(¬{bond3313})) ⊓ (≤ 5 hasAtom.Chlorine-93) ⊓ (∃ amesTestPositive.{true}))"
ce24 = "(¬{d156_1} ⊔ ¬{d156_10} ⊔ ¬{d156_19}) ⊓ (¬{d156_1 ⊔ d156_10})"
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce1, NS))),
family_reasoner.instances(dl_to_owl_expression("Child ⊓ Brother", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce2, NS))),
family_reasoner.instances(dl_to_owl_expression("Father ⊔ Brother", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce3, NS))),
family_reasoner.instances(dl_to_owl_expression("(∃ married.Female) ⊓ (∀ hasChild.Male)", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce4, NS))),
family_reasoner.instances(dl_to_owl_expression("(∀ married.(¬Female)) ⊔ (∃ hasChild.(¬Male))", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce5, NS))),
family_reasoner.instances(dl_to_owl_expression("∀ married.(∀ hasChild.((¬Daughter) ⊓ (∀ hasSibling.⊤)))", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce6, NS))),
family_reasoner.instances(dl_to_owl_expression("⊤", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce7, NS))),
family_reasoner.instances(dl_to_owl_expression("⊥", NS)))
self.assertCountEqual(family_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce8, NS))),
family_reasoner.instances(dl_to_owl_expression("Male ⊓ Child ⊓ (Son ⊔ Brother)", NS)))
# checking dataproperty-related ces in carcino
self.assertCountEqual(carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce9, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("∃ charge.(xsd:double[< 0.2] ⊓ xsd:double[≥ 0.1])", ns_carcino)))
self.assertCountEqual(carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce10, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("∃ charge.∃ charge.xsd:integer[> 3]", ns_carcino)))
self.assertCountEqual(carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce11, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("{d156_1 ⊔ d156_10 ⊔ d156_19 ⊔ d156_11}", ns_carcino)))
self.assertCountEqual(carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce12, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("{d156_10}", ns_carcino)))
hv1 = OWLObjectHasValue(property=OWLObjectProperty("http://dl-learner.org/carcinogenesis#hasAtom"),
individual=OWLNamedIndividual(
IRI.create("http://dl-learner.org/carcinogenesis#d156_10")))
hv2 = OWLObjectHasValue(property=OWLObjectProperty("http://dl-learner.org/carcinogenesis#hasAtom"),
individual=OWLNamedIndividual(
IRI.create("http://dl-learner.org/carcinogenesis#d156_10")))
sv1 = OWLObjectSomeValuesFrom(property=OWLObjectProperty("http://dl-learner.org/carcinogenesis#hasAtom"),
filler=OWLObjectOneOf([OWLNamedIndividual(
IRI.create("http://dl-learner.org/carcinogenesis#d156_10")),
OWLNamedIndividual(IRI.create(
"http://dl-learner.org/carcinogenesis#d156_11"))]))
sv2 = OWLObjectSomeValuesFrom(property=OWLObjectProperty("http://dl-learner.org/carcinogenesis#hasAtom"),
filler=OWLObjectOneOf([OWLNamedIndividual(
IRI.create("http://dl-learner.org/carcinogenesis#d156_10")),
OWLNamedIndividual(IRI.create(
"http://dl-learner.org/carcinogenesis#d156_12"))]))
c13 = OWLObjectUnionOf([hv1, hv2, sv1, sv2])
c14 = OWLObjectIntersectionOf([hv1, hv2, sv1, sv2])
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(c13)),
carcino_reasoner.instances(dl_to_owl_expression("∃ hasAtom.{d156_10 ⊔ d156_12 ⊔ d156_11}", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(c14)),
carcino_reasoner.instances(dl_to_owl_expression("∃ hasAtom.{d156_10}", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce15, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("{d156_1 ⊔ d156_11 ⊔ d156_19} ⊔ ({d156_10} ⊓ Oxygen-50)", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce16, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("({d156_11 ⊔ d156_1}) ⊓ (Oxygen-50)", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce17, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("∃ charge.xsd:double[≥ 0.15]", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce18, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("∃ charge.xsd:double[≥ 0.1]", ns_carcino)))
omc1 = OWLObjectMinCardinality(2, property=OWLObjectProperty("http://dl-learner.org/carcinogenesis#hasAtom"),
filler=OWLObjectOneOf([OWLNamedIndividual(
IRI.create("http://dl-learner.org/carcinogenesis#d156_10")),
OWLNamedIndividual(IRI.create(
"http://dl-learner.org/carcinogenesis#d156_11")),
OWLNamedIndividual(IRI.create(
"http://dl-learner.org/carcinogenesis#d156_12"))]))
omc2 = OWLObjectMinCardinality(20, property=OWLObjectProperty("http://dl-learner.org/carcinogenesis#hasAtom"),
filler=OWLObjectOneOf([OWLNamedIndividual(
IRI.create("http://dl-learner.org/carcinogenesis#d156_10")),
OWLNamedIndividual(IRI.create(
"http://dl-learner.org/carcinogenesis#d156_11")),
OWLNamedIndividual(IRI.create(
"http://dl-learner.org/carcinogenesis#d156_12"))]))
ce19 = OWLObjectUnionOf([omc1, omc2])
ce20 = OWLObjectIntersectionOf([omc1, omc2])
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(ce19)),
carcino_reasoner.instances(dl_to_owl_expression("≥ 2 hasAtom.{d156_11 ⊔ d156_10 ⊔ d156_12}", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(ce20)),
carcino_reasoner.instances(dl_to_owl_expression("≥ 20 hasAtom.{d156_11 ⊔ d156_10 ⊔ d156_12}", ns_carcino)))
self.assertCountEqual(
carcino_syncreasoner.instances(simplify_class_expression(dl_to_owl_expression(ce21, ns_carcino))),
carcino_syncreasoner.instances(dl_to_owl_expression("≤ 2 cytogen_ca.xsd:boolean", ns_carcino)))
self.assertCountEqual(
carcino_syncreasoner.instances(simplify_class_expression(dl_to_owl_expression(ce22, ns_carcino))),
carcino_syncreasoner.instances(dl_to_owl_expression("≤ 0 cytogen_ca.xsd:boolean", ns_carcino)))
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce23, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression(ce23_simplified, ns_carcino))
)
self.assertCountEqual(
carcino_reasoner.instances(simplify_class_expression(dl_to_owl_expression(ce24, ns_carcino))),
carcino_reasoner.instances(dl_to_owl_expression("(¬{d156_1 ⊔ d156_10})", ns_carcino)))