rustdl 0.3.2__tar.gz → 0.3.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. {rustdl-0.3.2 → rustdl-0.3.3}/Cargo.lock +9 -9
  2. {rustdl-0.3.2 → rustdl-0.3.3}/Cargo.toml +6 -6
  3. {rustdl-0.3.2 → rustdl-0.3.3}/PKG-INFO +1 -1
  4. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/convert.rs +5 -0
  5. rustdl-0.3.3/crates/owl-dl-core/src/disjunction_existential.rs +219 -0
  6. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/lib.rs +1 -0
  7. {rustdl-0.3.2 → rustdl-0.3.3}/README.md +0 -0
  8. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/Cargo.toml +0 -0
  9. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/README.md +0 -0
  10. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/absorb.rs +0 -0
  11. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/clause.rs +0 -0
  12. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/convert_back.rs +0 -0
  13. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/data_axioms.rs +0 -0
  14. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/definitions.rs +0 -0
  15. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/ir.rs +0 -0
  16. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/locality.rs +0 -0
  17. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/normalize.rs +0 -0
  18. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/ontology.rs +0 -0
  19. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/residual_trigger.rs +0 -0
  20. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/role_hierarchy.rs +0 -0
  21. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/told.rs +0 -0
  22. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/transform.rs +0 -0
  23. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/src/vocab.rs +0 -0
  24. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/tests/concept_pool_proptest.proptest-regressions +0 -0
  25. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/tests/concept_pool_proptest.rs +0 -0
  26. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/tests/convert_round_trip_proptest.rs +0 -0
  27. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-core/tests/role_hierarchy_proptest.rs +0 -0
  28. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-datatypes/Cargo.toml +0 -0
  29. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-datatypes/README.md +0 -0
  30. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-datatypes/src/lib.rs +0 -0
  31. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/.gitignore +0 -0
  32. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/Cargo.toml +0 -0
  33. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/README.md +0 -0
  34. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/src/classify.rs +0 -0
  35. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/src/errors.rs +0 -0
  36. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/src/lib.rs +0 -0
  37. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/src/load.rs +0 -0
  38. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/src/materialize.rs +0 -0
  39. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/src/queries.rs +0 -0
  40. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/conftest.py +0 -0
  41. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/test_classify.py +0 -0
  42. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/test_examples.py +0 -0
  43. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/test_materialize.py +0 -0
  44. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/test_queries.py +0 -0
  45. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/test_smoke.py +0 -0
  46. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-py/tests/python/test_soundness.py +0 -0
  47. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/Cargo.toml +0 -0
  48. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/README.md +0 -0
  49. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/src/abox_check.rs +0 -0
  50. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/src/classify.rs +0 -0
  51. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/src/lib.rs +0 -0
  52. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/src/model_cache.rs +0 -0
  53. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/src/realize.rs +0 -0
  54. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/src/union_find.rs +0 -0
  55. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/abox_consistency.rs +0 -0
  56. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/anon349_diagnostic.rs +0 -0
  57. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/datatype_completeness.rs +0 -0
  58. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p1_direct_bot.ofn +0 -0
  59. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p1_no_bot.ofn +0 -0
  60. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p2_disjoint_different_individuals.ofn +0 -0
  61. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p2_disjoint_types.ofn +0 -0
  62. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_neg_opa.ofn +0 -0
  63. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_neg_opa_no_clash.ofn +0 -0
  64. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_role_hierarchy_neg_consistent.ofn +0 -0
  65. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_role_hierarchy_neg_inconsistent.ofn +0 -0
  66. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p4_same_different.ofn +0 -0
  67. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p4_same_without_different.ofn +0 -0
  68. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p5_functional_diff.ofn +0 -0
  69. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p5_functional_same_target.ofn +0 -0
  70. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_asymmetric.ofn +0 -0
  71. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_asymmetric_one_way.ofn +0 -0
  72. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_irreflexive.ofn +0 -0
  73. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_irreflexive_distinct.ofn +0 -0
  74. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p7_range_compatible.ofn +0 -0
  75. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p7_range_disjoint.ofn +0 -0
  76. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_cardinality_disjoint.ofn +0 -0
  77. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_property_domain-classified.owx +0 -0
  78. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_property_domain.ofn +0 -0
  79. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_definition-classified.owx +0 -0
  80. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_definition.ofn +0 -0
  81. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_facet.ofn +0 -0
  82. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/functional_data_property.ofn +0 -0
  83. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/sub_data_property-classified.owx +0 -0
  84. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/sub_data_property.ofn +0 -0
  85. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/functional-equiv-some-bug.ofn +0 -0
  86. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/named-pizza-country-bug.ofn +0 -0
  87. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-01.txt +0 -0
  88. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-02.txt +0 -0
  89. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-03.txt +0 -0
  90. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-04.txt +0 -0
  91. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-05.txt +0 -0
  92. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-06.txt +0 -0
  93. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-07.txt +0 -0
  94. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-08.txt +0 -0
  95. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.hermit.owx +0 -0
  96. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.ofn +0 -0
  97. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.owx +0 -0
  98. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.hermit.owx +0 -0
  99. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.ofn +0 -0
  100. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.owx +0 -0
  101. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.hermit.owx +0 -0
  102. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.ofn +0 -0
  103. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.owx +0 -0
  104. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.hermit.owx +0 -0
  105. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.ofn +0 -0
  106. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.owx +0 -0
  107. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.hermit.owx +0 -0
  108. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.ofn +0 -0
  109. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.owx +0 -0
  110. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.hermit.owx +0 -0
  111. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.ofn +0 -0
  112. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.owx +0 -0
  113. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.hermit.owx +0 -0
  114. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.ofn +0 -0
  115. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.owx +0 -0
  116. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.hermit.owx +0 -0
  117. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.ofn +0 -0
  118. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.owx +0 -0
  119. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/phase2b-verdicts.log +0 -0
  120. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/konclude_closure_diff.rs +0 -0
  121. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/label_heuristic_canary.rs +0 -0
  122. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/phase2c_pair_06_canary.rs +0 -0
  123. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/real_ontology_corpus.rs +0 -0
  124. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-reasoner/tests/snapshot_phase0_canary.rs +0 -0
  125. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-saturation/Cargo.toml +0 -0
  126. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-saturation/README.md +0 -0
  127. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-saturation/src/lib.rs +0 -0
  128. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-saturation/tests/fixtures/phase2a_functional_role_canary.ofn +0 -0
  129. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-saturation/tests/fixtures/phase2b_compound_existential_canary.ofn +0 -0
  130. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/Cargo.toml +0 -0
  131. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/README.md +0 -0
  132. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/counters.rs +0 -0
  133. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/deps.rs +0 -0
  134. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/graph.rs +0 -0
  135. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/hyper.rs +0 -0
  136. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/lib.rs +0 -0
  137. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/replay.rs +0 -0
  138. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/rules.rs +0 -0
  139. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/saturate.rs +0 -0
  140. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/search.rs +0 -0
  141. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/snapshot.rs +0 -0
  142. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/src/trail.rs +0 -0
  143. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/tests/backprop_risk.rs +0 -0
  144. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/tests/replay_driver.rs +0 -0
  145. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/tests/replay_roundtrip.rs +0 -0
  146. {rustdl-0.3.2 → rustdl-0.3.3}/crates/owl-dl-tableau/tests/snapshot_capture.rs +0 -0
  147. {rustdl-0.3.2 → rustdl-0.3.3}/pyproject.toml +0 -0
  148. {rustdl-0.3.2 → rustdl-0.3.3}/python/rustdl/__init__.py +0 -0
  149. {rustdl-0.3.2 → rustdl-0.3.3}/python/rustdl/data/pizza.owl.gz +0 -0
  150. {rustdl-0.3.2 → rustdl-0.3.3}/python/rustdl/data/sio.owl.gz +0 -0
  151. {rustdl-0.3.2 → rustdl-0.3.3}/python/rustdl/data/sulo.owl.gz +0 -0
  152. {rustdl-0.3.2 → rustdl-0.3.3}/python/rustdl/examples.py +0 -0
@@ -1037,7 +1037,7 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
1037
1037
 
1038
1038
  [[package]]
1039
1039
  name = "owl-dl-bench"
1040
- version = "0.3.2"
1040
+ version = "0.3.3"
1041
1041
  dependencies = [
1042
1042
  "anyhow",
1043
1043
  "clap",
@@ -1054,7 +1054,7 @@ dependencies = [
1054
1054
 
1055
1055
  [[package]]
1056
1056
  name = "owl-dl-cli"
1057
- version = "0.3.2"
1057
+ version = "0.3.3"
1058
1058
  dependencies = [
1059
1059
  "anyhow",
1060
1060
  "clap",
@@ -1066,7 +1066,7 @@ dependencies = [
1066
1066
 
1067
1067
  [[package]]
1068
1068
  name = "owl-dl-core"
1069
- version = "0.3.2"
1069
+ version = "0.3.3"
1070
1070
  dependencies = [
1071
1071
  "bitvec",
1072
1072
  "bumpalo",
@@ -1080,7 +1080,7 @@ dependencies = [
1080
1080
 
1081
1081
  [[package]]
1082
1082
  name = "owl-dl-datatypes"
1083
- version = "0.3.2"
1083
+ version = "0.3.3"
1084
1084
  dependencies = [
1085
1085
  "owl-dl-core",
1086
1086
  "proptest",
@@ -1090,7 +1090,7 @@ dependencies = [
1090
1090
 
1091
1091
  [[package]]
1092
1092
  name = "owl-dl-py"
1093
- version = "0.3.2"
1093
+ version = "0.3.3"
1094
1094
  dependencies = [
1095
1095
  "horned-owl",
1096
1096
  "owl-dl-core",
@@ -1101,7 +1101,7 @@ dependencies = [
1101
1101
 
1102
1102
  [[package]]
1103
1103
  name = "owl-dl-reasoner"
1104
- version = "0.3.2"
1104
+ version = "0.3.3"
1105
1105
  dependencies = [
1106
1106
  "dashmap",
1107
1107
  "horned-owl",
@@ -1117,7 +1117,7 @@ dependencies = [
1117
1117
 
1118
1118
  [[package]]
1119
1119
  name = "owl-dl-saturation"
1120
- version = "0.3.2"
1120
+ version = "0.3.3"
1121
1121
  dependencies = [
1122
1122
  "dashmap",
1123
1123
  "fixedbitset",
@@ -1133,7 +1133,7 @@ dependencies = [
1133
1133
 
1134
1134
  [[package]]
1135
1135
  name = "owl-dl-tableau"
1136
- version = "0.3.2"
1136
+ version = "0.3.3"
1137
1137
  dependencies = [
1138
1138
  "bitvec",
1139
1139
  "bumpalo",
@@ -2569,7 +2569,7 @@ dependencies = [
2569
2569
 
2570
2570
  [[package]]
2571
2571
  name = "xtask"
2572
- version = "0.3.2"
2572
+ version = "0.3.3"
2573
2573
  dependencies = [
2574
2574
  "anyhow",
2575
2575
  "clap",
@@ -3,7 +3,7 @@ resolver = "2"
3
3
  members = ["crates/owl-dl-core", "crates/owl-dl-saturation", "crates/owl-dl-tableau", "crates/owl-dl-datatypes", "crates/owl-dl-reasoner", "crates/owl-dl-py"]
4
4
 
5
5
  [workspace.package]
6
- version = "0.3.2"
6
+ version = "0.3.3"
7
7
  edition = "2024"
8
8
  rust-version = "1.88"
9
9
  license = "Apache-2.0 OR MIT"
@@ -15,11 +15,11 @@ keywords = ["owl", "ontology", "reasoner", "description-logic", "semantic-web"]
15
15
  categories = ["science", "data-structures"]
16
16
 
17
17
  [workspace.dependencies]
18
- owl-dl-core = { path = "crates/owl-dl-core", version = "0.3.2" }
19
- owl-dl-saturation = { path = "crates/owl-dl-saturation", version = "0.3.2" }
20
- owl-dl-tableau = { path = "crates/owl-dl-tableau", version = "0.3.2" }
21
- owl-dl-datatypes = { path = "crates/owl-dl-datatypes", version = "0.3.2" }
22
- owl-dl-reasoner = { path = "crates/owl-dl-reasoner", version = "0.3.2" }
18
+ owl-dl-core = { path = "crates/owl-dl-core", version = "0.3.3" }
19
+ owl-dl-saturation = { path = "crates/owl-dl-saturation", version = "0.3.3" }
20
+ owl-dl-tableau = { path = "crates/owl-dl-tableau", version = "0.3.3" }
21
+ owl-dl-datatypes = { path = "crates/owl-dl-datatypes", version = "0.3.3" }
22
+ owl-dl-reasoner = { path = "crates/owl-dl-reasoner", version = "0.3.3" }
23
23
 
24
24
  horned-owl = { version = "1.4", default-features = false }
25
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rustdl
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: License :: OSI Approved :: Apache Software License
@@ -527,6 +527,11 @@ pub fn convert_ontology<A: ForIRI>(
527
527
  })
528
528
  };
529
529
  out.axioms.extend(derived);
530
+ // Derive `X ⊑ ∃R.C` from `X ⊑ ∃R.(D₁ ⊔ … ⊔ Dₙ)` when the disjuncts
531
+ // share a told-subsumer C (sound under-approximation; feeds the EL
532
+ // saturator a case-split it otherwise drops). Runs on the fully
533
+ // populated IR.
534
+ crate::disjunction_existential::derive_disjunction_existentials(&mut out);
530
535
  out.axioms.sort();
531
536
  Ok(out)
532
537
  }
@@ -0,0 +1,219 @@
1
+ //! Preprocessing pass: derive `X ⊑ ∃R.C` from
2
+ //! `X ⊑ ∃R.(D₁ ⊔ … ⊔ Dₙ)` when all disjuncts share a told-subsumer `C`.
3
+ //!
4
+ //! ## Why
5
+ //!
6
+ //! The consequence-based EL saturator drops existentials whose filler is
7
+ //! a disjunction (`∃R.(D₁ ⊔ … ⊔ Dₙ)` is out of EL). But when every
8
+ //! disjunct shares a common subsumer `C` — i.e. `Dᵢ ⊑ C` for all `i` —
9
+ //! the disjunction is eliminable by cases: `(D₁ ⊔ … ⊔ Dₙ) ⊑ C`, hence
10
+ //! `∃R.(D₁ ⊔ … ⊔ Dₙ) ⊑ ∃R.C`. Feeding the saturator the derived
11
+ //! `X ⊑ ∃R.C` lets it close subsumptions that otherwise need a full
12
+ //! tableau case-split.
13
+ //!
14
+ //! This is a **sound under-approximation**: every emitted axiom is
15
+ //! entailed, and we only use *told* (explicit, transitively-closed)
16
+ //! subsumers of *atomic* disjuncts, so no false positive is possible.
17
+ //! Cases where the common subsumer is only *derived* (not told), or a
18
+ //! disjunct is non-atomic, are left to the tableau/wedge.
19
+ //!
20
+ //! ## Impact
21
+ //!
22
+ //! Closes the SIO corpus MISSES `SIO_010092 ⊑ SIO_001353` and
23
+ //! `SIO_010092 ⊑ SIO_010410`: `SIO_010092` (DNA template) is
24
+ //! `⊑ ∃has-function.(template-for-RNA ⊔ template-for-DNA)`, both
25
+ //! disjuncts `⊑` `SIO_010088` (template-for-molecular-synthesis)
26
+ //! `⊑ realizable-entity`, and `has-function ⊑* has-realizable-property`.
27
+
28
+ use crate::ir::{ClassId, ConceptExpr, ConceptId, ConceptPool, Role};
29
+ use crate::ontology::{Axiom, InternalOntology};
30
+ use crate::told::{ToldTables, build_told_tables};
31
+
32
+ /// Scan `onto` for `SubClassOf(X, ∃R.(union-of-atomics))` (directly, or
33
+ /// as a conjunct of a top-level `And`) and append a derived
34
+ /// `SubClassOf(X, ∃R.C)` for each *minimal* common told-subsumer `C` of
35
+ /// the disjuncts. See the module docs for soundness.
36
+ pub fn derive_disjunction_existentials(onto: &mut InternalOntology) {
37
+ let told = build_told_tables(onto);
38
+ // Phase 1 (immutable borrow): collect (sub, role, common-class).
39
+ let mut triples: Vec<(ConceptId, Role, ClassId)> = Vec::new();
40
+ for ax in &onto.axioms {
41
+ let Axiom::SubClassOf { sub, sup } = ax else {
42
+ continue;
43
+ };
44
+ collect_from_sup(*sub, *sup, &onto.concepts, &told, &mut triples);
45
+ }
46
+ if triples.is_empty() {
47
+ return;
48
+ }
49
+ // Phase 2 (mutable borrow): intern the derived existentials + push.
50
+ for (sub, role, c) in triples {
51
+ let body = onto.concepts.atomic(c);
52
+ let sup = onto.concepts.some(role, body);
53
+ if sub == sup {
54
+ continue;
55
+ }
56
+ onto.axioms.push(Axiom::SubClassOf { sub, sup });
57
+ }
58
+ }
59
+
60
+ /// Handle a single `SubClassOf` super-concept: a direct `∃R.(union)` or
61
+ /// each `∃R.(union)` conjunct of a top-level `And`.
62
+ fn collect_from_sup(
63
+ sub: ConceptId,
64
+ sup: ConceptId,
65
+ pool: &ConceptPool,
66
+ told: &ToldTables,
67
+ out: &mut Vec<(ConceptId, Role, ClassId)>,
68
+ ) {
69
+ match pool.get(sup) {
70
+ ConceptExpr::Some(role, body) => {
71
+ for c in minimal_common_subsumers(*body, pool, told) {
72
+ out.push((sub, *role, c));
73
+ }
74
+ }
75
+ ConceptExpr::And(operands) => {
76
+ for &op in operands {
77
+ if let ConceptExpr::Some(role, body) = pool.get(op) {
78
+ for c in minimal_common_subsumers(*body, pool, told) {
79
+ out.push((sub, *role, c));
80
+ }
81
+ }
82
+ }
83
+ }
84
+ _ => {}
85
+ }
86
+ }
87
+
88
+ /// If `body` is `Or(D₁, …, Dₙ)` with all `Dᵢ` atomic and `n ≥ 2`,
89
+ /// return the *minimal* (most specific) classes `C` such that every
90
+ /// `Dᵢ ⊑ C` is told. Empty otherwise.
91
+ fn minimal_common_subsumers(
92
+ body: ConceptId,
93
+ pool: &ConceptPool,
94
+ told: &ToldTables,
95
+ ) -> Vec<ClassId> {
96
+ let ConceptExpr::Or(disjuncts) = pool.get(body) else {
97
+ return Vec::new();
98
+ };
99
+ let mut atoms: Vec<ClassId> = Vec::with_capacity(disjuncts.len());
100
+ for &d in disjuncts {
101
+ match pool.get(d) {
102
+ ConceptExpr::Atomic(c) => atoms.push(*c),
103
+ // A non-atomic disjunct (nested ∃, And, …) is left to the
104
+ // tableau — keep this pass a sound under-approximation.
105
+ _ => return Vec::new(),
106
+ }
107
+ }
108
+ if atoms.len() < 2 {
109
+ return Vec::new();
110
+ }
111
+ // Intersection of the (reflexive, transitively-closed, sorted)
112
+ // told-super-class sets. Reflexivity is sound here: a disjunct `Dᵢ`
113
+ // lands in the intersection only if it told-subsumes every other
114
+ // disjunct, in which case `Dᵢ ⊒ (D₁ ⊔ … ⊔ Dₙ)` and `∃R.Dᵢ` holds.
115
+ let mut common: Vec<ClassId> = told.super_classes(atoms[0]).to_vec();
116
+ for &a in &atoms[1..] {
117
+ let supers = told.super_classes(a);
118
+ common.retain(|c| supers.binary_search(c).is_ok());
119
+ if common.is_empty() {
120
+ return Vec::new();
121
+ }
122
+ }
123
+ // Keep only minimal elements: drop `C` if some other common `C'` is
124
+ // told-below `C` (the saturator recovers the weaker supers from the
125
+ // minimal ones, so emitting the whole chain is redundant).
126
+ common
127
+ .iter()
128
+ .copied()
129
+ .filter(|&c| {
130
+ !common
131
+ .iter()
132
+ .any(|&other| other != c && told.is_told_sub(other, c))
133
+ })
134
+ .collect()
135
+ }
136
+
137
+ #[cfg(test)]
138
+ mod tests {
139
+ use crate::ir::{ConceptExpr, Role};
140
+ use horned_owl::io::ParserConfiguration;
141
+ use horned_owl::io::ofn::reader::read;
142
+ use horned_owl::model::RcStr;
143
+ use horned_owl::ontology::set::SetOntology;
144
+ use std::io::Cursor;
145
+
146
+ /// The SIO pattern: `X ⊑ ∃R.(D1 ⊔ D2)` with `D1,D2 ⊑ E ⊑ F`. The
147
+ /// pass (run inside `convert_ontology`) must add `X ⊑ ∃R.E` (E is
148
+ /// the minimal common told-subsumer), and must NOT add the weaker
149
+ /// `X ⊑ ∃R.F` (only minimal subsumers). Mirrors `SIO_010092`'s
150
+ /// `∃has-function.(template-RNA ⊔ template-DNA)`.
151
+ #[test]
152
+ fn pass_emits_minimal_common_subsumer_existential() {
153
+ let src = "\
154
+ Prefix(:=<http://t.org/#>)
155
+ Ontology(
156
+ Declaration(Class(:X)) Declaration(Class(:D1)) Declaration(Class(:D2))
157
+ Declaration(Class(:E)) Declaration(Class(:F))
158
+ Declaration(ObjectProperty(:R))
159
+ SubClassOf(:X ObjectSomeValuesFrom(:R ObjectUnionOf(:D1 :D2)))
160
+ SubClassOf(:D1 :E) SubClassOf(:D2 :E) SubClassOf(:E :F)
161
+ )
162
+ ";
163
+ let (set_onto, _): (SetOntology<RcStr>, _) =
164
+ read(&mut Cursor::new(src), ParserConfiguration::default()).expect("parses");
165
+ // convert_ontology runs the pass.
166
+ let onto = crate::convert::convert_ontology(&set_onto).expect("converts");
167
+ let cid = |iri: &str| onto.vocabulary.class_id(iri).expect("declared");
168
+ let x = cid("http://t.org/#X");
169
+ let e = cid("http://t.org/#E");
170
+ let f = cid("http://t.org/#F");
171
+
172
+ let some_class = |target| {
173
+ onto.axioms.iter().any(|ax| {
174
+ if let crate::ontology::Axiom::SubClassOf { sub, sup } = ax {
175
+ matches!(onto.concepts.get(*sub), ConceptExpr::Atomic(c) if *c == x)
176
+ && matches!(onto.concepts.get(*sup),
177
+ ConceptExpr::Some(Role::Named(_), body)
178
+ if matches!(onto.concepts.get(*body), ConceptExpr::Atomic(c) if *c == target))
179
+ } else {
180
+ false
181
+ }
182
+ })
183
+ };
184
+ assert!(
185
+ some_class(e),
186
+ "expected derived X ⊑ ∃R.E (minimal common subsumer)"
187
+ );
188
+ assert!(
189
+ !some_class(f),
190
+ "should NOT emit the non-minimal X ⊑ ∃R.F (E ⊑ F already covers it)"
191
+ );
192
+ }
193
+
194
+ /// No common subsumer ⇒ no derived axiom (and no panic).
195
+ #[test]
196
+ fn pass_no_common_subsumer_emits_nothing() {
197
+ let src = "\
198
+ Prefix(:=<http://t.org/#>)
199
+ Ontology(
200
+ Declaration(Class(:X)) Declaration(Class(:D1)) Declaration(Class(:D2))
201
+ Declaration(ObjectProperty(:R))
202
+ SubClassOf(:X ObjectSomeValuesFrom(:R ObjectUnionOf(:D1 :D2)))
203
+ )
204
+ ";
205
+ let (set_onto, _): (SetOntology<RcStr>, _) =
206
+ read(&mut Cursor::new(src), ParserConfiguration::default()).expect("parses");
207
+ let onto = crate::convert::convert_ontology(&set_onto).expect("converts");
208
+ let x = onto.vocabulary.class_id("http://t.org/#X").expect("X");
209
+ // The only ∃R.* axiom on X is the original union; no atomic-body
210
+ // existential was derived (D1, D2 share no told subsumer).
211
+ let derived = onto.axioms.iter().any(|ax| {
212
+ matches!(ax, crate::ontology::Axiom::SubClassOf { sub, sup }
213
+ if matches!(onto.concepts.get(*sub), ConceptExpr::Atomic(c) if *c == x)
214
+ && matches!(onto.concepts.get(*sup),
215
+ ConceptExpr::Some(_, body) if matches!(onto.concepts.get(*body), ConceptExpr::Atomic(_))))
216
+ });
217
+ assert!(!derived, "no common subsumer ⇒ nothing derived");
218
+ }
219
+ }
@@ -13,6 +13,7 @@ pub mod convert;
13
13
  pub mod convert_back;
14
14
  pub mod data_axioms;
15
15
  pub mod definitions;
16
+ pub mod disjunction_existential;
16
17
  pub mod ir;
17
18
  pub mod locality;
18
19
  pub mod normalize;
File without changes
File without changes
File without changes
File without changes