rustdl 0.4.2__tar.gz → 0.4.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 (285) hide show
  1. {rustdl-0.4.2 → rustdl-0.4.3}/Cargo.lock +10 -10
  2. {rustdl-0.4.2 → rustdl-0.4.3}/Cargo.toml +7 -7
  3. {rustdl-0.4.2 → rustdl-0.4.3}/PKG-INFO +1 -1
  4. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/README.md +22 -0
  5. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-datatypes/README.md +22 -0
  6. rustdl-0.4.3/crates/owl-dl-py/src/queries.rs +182 -0
  7. rustdl-0.4.3/crates/owl-dl-py/tests/python/test_queries.py +171 -0
  8. {rustdl-0.4.2/crates/owl-dl-saturation → rustdl-0.4.3/crates/owl-dl-reasoner}/README.md +22 -0
  9. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/abox_saturation.rs +88 -0
  10. rustdl-0.4.3/crates/owl-dl-reasoner/src/disjointness.rs +184 -0
  11. rustdl-0.4.3/crates/owl-dl-reasoner/src/individuals.rs +241 -0
  12. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/lib.rs +353 -0
  13. rustdl-0.4.3/crates/owl-dl-reasoner/src/property_classify.rs +106 -0
  14. rustdl-0.4.3/crates/owl-dl-reasoner/src/property_values.rs +498 -0
  15. rustdl-0.4.3/crates/owl-dl-reasoner/tests/disjoint_nodecap.rs +100 -0
  16. rustdl-0.4.3/crates/owl-dl-reasoner/tests/disjoint_oracle.rs +213 -0
  17. rustdl-0.4.3/crates/owl-dl-reasoner/tests/fixtures/disjoint/dj-disjoint.owx +71 -0
  18. rustdl-0.4.3/crates/owl-dl-reasoner/tests/fixtures/disjoint/dj.ofn +16 -0
  19. rustdl-0.4.3/crates/owl-dl-reasoner/tests/fixtures/individuals/inds.ofn +30 -0
  20. rustdl-0.4.3/crates/owl-dl-reasoner/tests/fixtures/property_values/pv-materialized.owx +127 -0
  21. rustdl-0.4.3/crates/owl-dl-reasoner/tests/fixtures/property_values/pv.ofn +19 -0
  22. rustdl-0.4.3/crates/owl-dl-reasoner/tests/individuals_nodecap.rs +93 -0
  23. rustdl-0.4.3/crates/owl-dl-reasoner/tests/individuals_oracle.rs +310 -0
  24. rustdl-0.4.3/crates/owl-dl-reasoner/tests/property_hierarchy.rs +112 -0
  25. rustdl-0.4.3/crates/owl-dl-reasoner/tests/property_values_oracle.rs +456 -0
  26. {rustdl-0.4.2/crates/owl-dl-reasoner → rustdl-0.4.3/crates/owl-dl-saturation}/README.md +22 -0
  27. rustdl-0.4.3/crates/owl-dl-tableau/README.md +205 -0
  28. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/__init__.py +80 -0
  29. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/__init__.pyi +58 -0
  30. rustdl-0.4.2/crates/owl-dl-py/src/queries.rs +0 -71
  31. rustdl-0.4.2/crates/owl-dl-py/tests/python/test_queries.py +0 -43
  32. rustdl-0.4.2/crates/owl-dl-tableau/README.md +0 -183
  33. {rustdl-0.4.2 → rustdl-0.4.3}/README.md +0 -0
  34. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/Cargo.toml +0 -0
  35. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/absorb.rs +0 -0
  36. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/approx_saturation.rs +0 -0
  37. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/clause.rs +0 -0
  38. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/convert.rs +0 -0
  39. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/convert_back.rs +0 -0
  40. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/data_axioms.rs +0 -0
  41. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/definitions.rs +0 -0
  42. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/disjunction_existential.rs +0 -0
  43. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/disjunctive_antecedent.rs +0 -0
  44. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/ir.rs +0 -0
  45. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/lib.rs +0 -0
  46. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/locality.rs +0 -0
  47. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/normalize.rs +0 -0
  48. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/ontology.rs +0 -0
  49. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/residual_trigger.rs +0 -0
  50. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/role_hierarchy.rs +0 -0
  51. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/told.rs +0 -0
  52. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/transform.rs +0 -0
  53. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/src/vocab.rs +0 -0
  54. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/tests/concept_pool_proptest.proptest-regressions +0 -0
  55. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/tests/concept_pool_proptest.rs +0 -0
  56. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/tests/convert_round_trip_proptest.rs +0 -0
  57. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-core/tests/role_hierarchy_proptest.rs +0 -0
  58. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-datatypes/Cargo.toml +0 -0
  59. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-datatypes/src/lib.rs +0 -0
  60. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/.gitignore +0 -0
  61. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/Cargo.toml +0 -0
  62. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/README.md +0 -0
  63. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/.gitignore +0 -0
  64. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/README.md +0 -0
  65. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/__init__.py +0 -0
  66. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/fixtures/recorded_replies_clash.json +0 -0
  67. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/fixtures/seed.ofn +0 -0
  68. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/gate.py +0 -0
  69. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/llm.py +0 -0
  70. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/loop.py +0 -0
  71. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out/candidate.ofn +0 -0
  72. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out/current.ofn +0 -0
  73. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out/metrics.md +0 -0
  74. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out/transcript.jsonl +0 -0
  75. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out-clash/candidate.ofn +0 -0
  76. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out-clash/current.ofn +0 -0
  77. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out-clash/metrics.md +0 -0
  78. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/out-clash/transcript.jsonl +0 -0
  79. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/requirements.txt +0 -0
  80. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/run.py +0 -0
  81. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/tests/__init__.py +0 -0
  82. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/tests/test_gate.py +0 -0
  83. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/tests/test_llm.py +0 -0
  84. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/tests/test_loop.py +0 -0
  85. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/tests/test_run.py +0 -0
  86. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/examples/nesy_loop/tests/test_seed.py +0 -0
  87. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/src/classify.rs +0 -0
  88. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/src/errors.rs +0 -0
  89. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/src/explain.rs +0 -0
  90. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/src/lib.rs +0 -0
  91. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/src/load.rs +0 -0
  92. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/src/materialize.rs +0 -0
  93. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/conftest.py +0 -0
  94. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_classify.py +0 -0
  95. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_examples.py +0 -0
  96. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_explain.py +0 -0
  97. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_manchester.py +0 -0
  98. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_materialize.py +0 -0
  99. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_results.py +0 -0
  100. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_smoke.py +0 -0
  101. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_soundness.py +0 -0
  102. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_stubs.py +0 -0
  103. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-py/tests/python/test_tutorial.py +0 -0
  104. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/Cargo.toml +0 -0
  105. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/examples/embed_classify.rs +0 -0
  106. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/abox_check.rs +0 -0
  107. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/classify.rs +0 -0
  108. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/diagnose.rs +0 -0
  109. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/justify.rs +0 -0
  110. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/laconic.rs +0 -0
  111. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/model_cache.rs +0 -0
  112. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/oracle_diff.rs +0 -0
  113. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/realize.rs +0 -0
  114. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/repair.rs +0 -0
  115. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/src/union_find.rs +0 -0
  116. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/abox_chain_index.rs +0 -0
  117. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/abox_consistency.rs +0 -0
  118. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/abox_disjoint_index.rs +0 -0
  119. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/abox_sat_fp_probe.rs +0 -0
  120. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/abox_saturation.rs +0 -0
  121. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/adaptive_budget.rs +0 -0
  122. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/anon349_diagnostic.rs +0 -0
  123. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/anonymous_individuals_identity.rs +0 -0
  124. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/anonymous_individuals_reporting.rs +0 -0
  125. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/approx_saturation_forced_disjunct.rs +0 -0
  126. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/backfold.rs +0 -0
  127. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/backjump_precision_gate.rs +0 -0
  128. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/bjgap_dl_tail.rs +0 -0
  129. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/blocked_disjunction_soundness.rs +0 -0
  130. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/blocked_disjunction_termination.rs +0 -0
  131. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/cardinality_disjunct_atoms.rs +0 -0
  132. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/classify_concrete_domain.rs +0 -0
  133. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/classify_defined_sweep.rs +0 -0
  134. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/classify_inverse_domain.rs +0 -0
  135. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/completeness_contract.rs +0 -0
  136. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/concrete_domain_clash.rs +0 -0
  137. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/data_properties.rs +0 -0
  138. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/data_property_assertions.rs +0 -0
  139. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/datatype_completeness.rs +0 -0
  140. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/datatype_inconsistency.rs +0 -0
  141. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/datatype_value_membership.rs +0 -0
  142. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/decide_pair_probe.rs +0 -0
  143. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/diagnose_partition.rs +0 -0
  144. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/disjunctive_existential_marker_fp.rs +0 -0
  145. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/domain_gci_completeness.rs +0 -0
  146. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/existential_successors.rs +0 -0
  147. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/exists_top_filler.rs +0 -0
  148. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p1_direct_bot.ofn +0 -0
  149. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p1_no_bot.ofn +0 -0
  150. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p2_disjoint_different_individuals.ofn +0 -0
  151. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p2_disjoint_types.ofn +0 -0
  152. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_neg_opa.ofn +0 -0
  153. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_neg_opa_no_clash.ofn +0 -0
  154. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_role_hierarchy_neg_consistent.ofn +0 -0
  155. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_role_hierarchy_neg_inconsistent.ofn +0 -0
  156. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p4_same_different.ofn +0 -0
  157. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p4_same_without_different.ofn +0 -0
  158. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p5_functional_diff.ofn +0 -0
  159. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p5_functional_same_target.ofn +0 -0
  160. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_asymmetric.ofn +0 -0
  161. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_asymmetric_one_way.ofn +0 -0
  162. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_irreflexive.ofn +0 -0
  163. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_irreflexive_distinct.ofn +0 -0
  164. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p7_range_compatible.ofn +0 -0
  165. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/abox/p7_range_disjoint.ofn +0 -0
  166. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_cardinality_disjoint.ofn +0 -0
  167. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_property_domain-classified.owx +0 -0
  168. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_property_domain.ofn +0 -0
  169. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_definition-classified.owx +0 -0
  170. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_definition.ofn +0 -0
  171. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_facet.ofn +0 -0
  172. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/functional_data_property.ofn +0 -0
  173. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/sub_data_property-classified.owx +0 -0
  174. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/datatype/sub_data_property.ofn +0 -0
  175. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/functional-equiv-some-bug.ofn +0 -0
  176. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/materialize/rbox-materialized.owx +0 -0
  177. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/materialize/rbox.ofn +0 -0
  178. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/named-pizza-country-bug.ofn +0 -0
  179. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-01.txt +0 -0
  180. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-02.txt +0 -0
  181. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-03.txt +0 -0
  182. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-04.txt +0 -0
  183. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-05.txt +0 -0
  184. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-06.txt +0 -0
  185. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-07.txt +0 -0
  186. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-08.txt +0 -0
  187. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.hermit.owx +0 -0
  188. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.ofn +0 -0
  189. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.owx +0 -0
  190. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.hermit.owx +0 -0
  191. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.ofn +0 -0
  192. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.owx +0 -0
  193. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.hermit.owx +0 -0
  194. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.ofn +0 -0
  195. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.owx +0 -0
  196. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.hermit.owx +0 -0
  197. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.ofn +0 -0
  198. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.owx +0 -0
  199. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.hermit.owx +0 -0
  200. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.ofn +0 -0
  201. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.owx +0 -0
  202. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.hermit.owx +0 -0
  203. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.ofn +0 -0
  204. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.owx +0 -0
  205. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.hermit.owx +0 -0
  206. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.ofn +0 -0
  207. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.owx +0 -0
  208. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.hermit.owx +0 -0
  209. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.ofn +0 -0
  210. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.owx +0 -0
  211. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/phase2b/phase2b-verdicts.log +0 -0
  212. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/regression/chain_closure_consistent.ofn +0 -0
  213. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/regression/issue35_nominal_cycle_hang.ofn +0 -0
  214. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/regression/issue35_tableau_depth_hang.ofn +0 -0
  215. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/fixtures/regression/realize_inconsistent.ofn +0 -0
  216. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/funcmerge_inverse.rs +0 -0
  217. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/funcmerge_scaling.rs +0 -0
  218. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/functional_enforcement.rs +0 -0
  219. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/inverse_cardinality_soundness.rs +0 -0
  220. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/inverse_symmetric_domain.rs +0 -0
  221. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/issue35_nominal_cycle_hang.rs +0 -0
  222. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/issue35_tableau_depth_hang.rs +0 -0
  223. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/justification.rs +0 -0
  224. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/konclude_closure_diff.rs +0 -0
  225. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/label_heuristic_canary.rs +0 -0
  226. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/laconic_justification.rs +0 -0
  227. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/materialize_oracle.rs +0 -0
  228. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/node_cap.rs +0 -0
  229. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/nominal_cardinality_realize.rs +0 -0
  230. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/object_has_self_domain.rs +0 -0
  231. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/phase2c_pair_06_canary.rs +0 -0
  232. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/precompletion_probe_gate.rs +0 -0
  233. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/property_assertions.rs +0 -0
  234. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/real_ontology_corpus.rs +0 -0
  235. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/realize_inconsistent_shortcircuit.rs +0 -0
  236. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/repair_suggestions.rs +0 -0
  237. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/sat_lookahead_gate.rs +0 -0
  238. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/saturator_disjointness.rs +0 -0
  239. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/seed_probe_gate.rs +0 -0
  240. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/shadow_dep_gate.rs +0 -0
  241. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/snapshot_phase0_canary.rs +0 -0
  242. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/sp2_nogood_gate.rs +0 -0
  243. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/sparse_classification_identity.rs +0 -0
  244. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/subproperty_axioms.rs +0 -0
  245. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/tautology_skip_canary.rs +0 -0
  246. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/tbox_only_classify.rs +0 -0
  247. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/top_subsumes_all.rs +0 -0
  248. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/value_type_disjoint_canary.rs +0 -0
  249. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/value_type_disjoint_probe.rs +0 -0
  250. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-reasoner/tests/wedge_consistency.rs +0 -0
  251. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-saturation/Cargo.toml +0 -0
  252. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-saturation/src/lib.rs +0 -0
  253. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-saturation/src/proof.rs +0 -0
  254. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-saturation/src/seed_sat.rs +0 -0
  255. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-saturation/tests/fixtures/phase2a_functional_role_canary.ofn +0 -0
  256. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-saturation/tests/fixtures/phase2b_compound_existential_canary.ofn +0 -0
  257. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/Cargo.toml +0 -0
  258. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/counters.rs +0 -0
  259. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/deps.rs +0 -0
  260. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/graph.rs +0 -0
  261. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/hyper.rs +0 -0
  262. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/lib.rs +0 -0
  263. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/replay.rs +0 -0
  264. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/rules.rs +0 -0
  265. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/saturate.rs +0 -0
  266. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/search.rs +0 -0
  267. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/shadow_measures.rs +0 -0
  268. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/snapshot.rs +0 -0
  269. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/src/trail.rs +0 -0
  270. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/backprop_risk.rs +0 -0
  271. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/nominal_first_bounded.rs +0 -0
  272. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/nominal_first_bounded_divergence_canary.rs +0 -0
  273. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/replay_driver.rs +0 -0
  274. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/replay_roundtrip.rs +0 -0
  275. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/sat_lookahead_drop.rs +0 -0
  276. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/semantic_branching.rs +0 -0
  277. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/shadow_dep_probe.rs +0 -0
  278. {rustdl-0.4.2 → rustdl-0.4.3}/crates/owl-dl-tableau/tests/snapshot_capture.rs +0 -0
  279. {rustdl-0.4.2 → rustdl-0.4.3}/pyproject.toml +0 -0
  280. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/_results.py +0 -0
  281. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/data/pizza.owl.gz +0 -0
  282. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/data/sio.owl.gz +0 -0
  283. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/data/sulo.owl.gz +0 -0
  284. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/examples.py +0 -0
  285. {rustdl-0.4.2 → rustdl-0.4.3}/python/rustdl/py.typed +0 -0
@@ -1018,7 +1018,7 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
1018
1018
 
1019
1019
  [[package]]
1020
1020
  name = "owl-dl-bench"
1021
- version = "0.4.2"
1021
+ version = "0.4.3"
1022
1022
  dependencies = [
1023
1023
  "anyhow",
1024
1024
  "clap",
@@ -1038,7 +1038,7 @@ dependencies = [
1038
1038
 
1039
1039
  [[package]]
1040
1040
  name = "owl-dl-cb"
1041
- version = "0.4.2"
1041
+ version = "0.4.3"
1042
1042
  dependencies = [
1043
1043
  "hashbrown 0.15.5",
1044
1044
  "owl-dl-core",
@@ -1046,7 +1046,7 @@ dependencies = [
1046
1046
 
1047
1047
  [[package]]
1048
1048
  name = "owl-dl-cli"
1049
- version = "0.4.2"
1049
+ version = "0.4.3"
1050
1050
  dependencies = [
1051
1051
  "anyhow",
1052
1052
  "clap",
@@ -1061,7 +1061,7 @@ dependencies = [
1061
1061
 
1062
1062
  [[package]]
1063
1063
  name = "owl-dl-core"
1064
- version = "0.4.2"
1064
+ version = "0.4.3"
1065
1065
  dependencies = [
1066
1066
  "bitvec",
1067
1067
  "bumpalo",
@@ -1075,7 +1075,7 @@ dependencies = [
1075
1075
 
1076
1076
  [[package]]
1077
1077
  name = "owl-dl-datatypes"
1078
- version = "0.4.2"
1078
+ version = "0.4.3"
1079
1079
  dependencies = [
1080
1080
  "owl-dl-core",
1081
1081
  "proptest",
@@ -1085,7 +1085,7 @@ dependencies = [
1085
1085
 
1086
1086
  [[package]]
1087
1087
  name = "owl-dl-py"
1088
- version = "0.4.2"
1088
+ version = "0.4.3"
1089
1089
  dependencies = [
1090
1090
  "horned-owl",
1091
1091
  "owl-dl-core",
@@ -1096,7 +1096,7 @@ dependencies = [
1096
1096
 
1097
1097
  [[package]]
1098
1098
  name = "owl-dl-reasoner"
1099
- version = "0.4.2"
1099
+ version = "0.4.3"
1100
1100
  dependencies = [
1101
1101
  "anyhow",
1102
1102
  "dashmap",
@@ -1114,7 +1114,7 @@ dependencies = [
1114
1114
 
1115
1115
  [[package]]
1116
1116
  name = "owl-dl-saturation"
1117
- version = "0.4.2"
1117
+ version = "0.4.3"
1118
1118
  dependencies = [
1119
1119
  "dashmap",
1120
1120
  "fixedbitset",
@@ -1130,7 +1130,7 @@ dependencies = [
1130
1130
 
1131
1131
  [[package]]
1132
1132
  name = "owl-dl-tableau"
1133
- version = "0.4.2"
1133
+ version = "0.4.3"
1134
1134
  dependencies = [
1135
1135
  "bitvec",
1136
1136
  "bumpalo",
@@ -2556,7 +2556,7 @@ dependencies = [
2556
2556
 
2557
2557
  [[package]]
2558
2558
  name = "xtask"
2559
- version = "0.4.2"
2559
+ version = "0.4.3"
2560
2560
  dependencies = [
2561
2561
  "anyhow",
2562
2562
  "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.4.2"
6
+ version = "0.4.3"
7
7
  edition = "2024"
8
8
  rust-version = "1.88"
9
9
  license = "Apache-2.0 OR MIT"
@@ -15,12 +15,12 @@ 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.4.2" }
19
- owl-dl-saturation = { path = "crates/owl-dl-saturation", version = "0.4.2" }
20
- owl-dl-tableau = { path = "crates/owl-dl-tableau", version = "0.4.2" }
21
- owl-dl-datatypes = { path = "crates/owl-dl-datatypes", version = "0.4.2" }
22
- owl-dl-cb = { path = "crates/owl-dl-cb", version = "0.4.2" }
23
- owl-dl-reasoner = { path = "crates/owl-dl-reasoner", version = "0.4.2" }
18
+ owl-dl-core = { path = "crates/owl-dl-core", version = "0.4.3" }
19
+ owl-dl-saturation = { path = "crates/owl-dl-saturation", version = "0.4.3" }
20
+ owl-dl-tableau = { path = "crates/owl-dl-tableau", version = "0.4.3" }
21
+ owl-dl-datatypes = { path = "crates/owl-dl-datatypes", version = "0.4.3" }
22
+ owl-dl-cb = { path = "crates/owl-dl-cb", version = "0.4.3" }
23
+ owl-dl-reasoner = { path = "crates/owl-dl-reasoner", version = "0.4.3" }
24
24
 
25
25
  horned-owl = { version = "1.4", default-features = false }
26
26
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rustdl
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Classifier: Development Status :: 4 - Beta
5
5
  Classifier: Intended Audience :: Science/Research
6
6
  Classifier: License :: OSI Approved :: Apache Software License
@@ -5,6 +5,7 @@
5
5
  [![license](https://img.shields.io/badge/license-Apache--2.0%20OR%20MIT-blue)](#licensing)
6
6
  [![Rust](https://img.shields.io/badge/Rust-1.88%2B-orange?logo=rust&logoColor=white)](https://www.rust-lang.org)
7
7
  [![Python](https://img.shields.io/badge/Python-3.10%2B-blue?logo=python&logoColor=white)](https://pypi.org/project/rustdl/)
8
+ [![Protégé plugin](https://img.shields.io/badge/Prot%C3%A9g%C3%A9-plugin-blue)](protege/README.md)
8
9
 
9
10
  A **sound** OWL 2 DL (SROIQ) reasoner in Rust. Konclude-style hybrid: a
10
11
  consequence-based **saturation** engine handles the EL-ish fragment, a
@@ -175,6 +176,27 @@ Any run that hits a bound prints a prominent `INCOMPLETE` warning to stderr.
175
176
  Diagnostics: `RUSTDL_TRACE=1` (one stderr line per search/branch decision);
176
177
  `RUSTDL_COUNTERS=1` with `--features counters` (per-rule call counts).
177
178
 
179
+ ## Protégé plugin
180
+
181
+ rustdl runs as a Protégé Desktop reasoner.
182
+
183
+ **Install:** download `rustdl-protege-<version>.jar` from the
184
+ [latest release](https://github.com/MaastrichtU-IDS/rustdl/releases/latest), drop
185
+ it into Protégé's `plugins/` directory, and restart. Choose **rustdl** under
186
+ Reasoner ▸, then Reasoner ▸ Start reasoner.
187
+
188
+ **Computes (v1):** consistency, the inferred class hierarchy, unsatisfiable
189
+ classes, and class assertions (types / instances). Property hierarchies & values,
190
+ same/different individuals, disjointness, and complex-class-expression queries
191
+ return empty for now.
192
+
193
+ **Config** (JVM system property, else env var): `-Drustdl.bin=…` / `RUSTDL_BIN`
194
+ for a specific binary; `-Drustdl.timeout.seconds=…` / `RUSTDL_TIMEOUT_SECONDS`
195
+ (default 600) for the per-call timeout.
196
+
197
+ Requires Protégé 5.6.x (Java 11+). Build-from-source and the full contract:
198
+ [`protege/README.md`](protege/README.md), [`docs/protege-plugin.md`](docs/protege-plugin.md).
199
+
178
200
  ## Licensing
179
201
 
180
202
  Dual-licensed [Apache-2.0](LICENSE-APACHE) **OR** [MIT](LICENSE-MIT). `horned-owl`
@@ -5,6 +5,7 @@
5
5
  [![license](https://img.shields.io/badge/license-Apache--2.0%20OR%20MIT-blue)](#licensing)
6
6
  [![Rust](https://img.shields.io/badge/Rust-1.88%2B-orange?logo=rust&logoColor=white)](https://www.rust-lang.org)
7
7
  [![Python](https://img.shields.io/badge/Python-3.10%2B-blue?logo=python&logoColor=white)](https://pypi.org/project/rustdl/)
8
+ [![Protégé plugin](https://img.shields.io/badge/Prot%C3%A9g%C3%A9-plugin-blue)](protege/README.md)
8
9
 
9
10
  A **sound** OWL 2 DL (SROIQ) reasoner in Rust. Konclude-style hybrid: a
10
11
  consequence-based **saturation** engine handles the EL-ish fragment, a
@@ -175,6 +176,27 @@ Any run that hits a bound prints a prominent `INCOMPLETE` warning to stderr.
175
176
  Diagnostics: `RUSTDL_TRACE=1` (one stderr line per search/branch decision);
176
177
  `RUSTDL_COUNTERS=1` with `--features counters` (per-rule call counts).
177
178
 
179
+ ## Protégé plugin
180
+
181
+ rustdl runs as a Protégé Desktop reasoner.
182
+
183
+ **Install:** download `rustdl-protege-<version>.jar` from the
184
+ [latest release](https://github.com/MaastrichtU-IDS/rustdl/releases/latest), drop
185
+ it into Protégé's `plugins/` directory, and restart. Choose **rustdl** under
186
+ Reasoner ▸, then Reasoner ▸ Start reasoner.
187
+
188
+ **Computes (v1):** consistency, the inferred class hierarchy, unsatisfiable
189
+ classes, and class assertions (types / instances). Property hierarchies & values,
190
+ same/different individuals, disjointness, and complex-class-expression queries
191
+ return empty for now.
192
+
193
+ **Config** (JVM system property, else env var): `-Drustdl.bin=…` / `RUSTDL_BIN`
194
+ for a specific binary; `-Drustdl.timeout.seconds=…` / `RUSTDL_TIMEOUT_SECONDS`
195
+ (default 600) for the per-call timeout.
196
+
197
+ Requires Protégé 5.6.x (Java 11+). Build-from-source and the full contract:
198
+ [`protege/README.md`](protege/README.md), [`docs/protege-plugin.md`](docs/protege-plugin.md).
199
+
178
200
  ## Licensing
179
201
 
180
202
  Dual-licensed [Apache-2.0](LICENSE-APACHE) **OR** [MIT](LICENSE-MIT). `horned-owl`
@@ -0,0 +1,182 @@
1
+ //! Top-level query bindings: consistency, satisfiability, subsumption,
2
+ //! instance checks, realization.
3
+
4
+ use std::collections::HashMap;
5
+
6
+ use pyo3::prelude::*;
7
+
8
+ use crate::errors::reason_error_to_py;
9
+ use crate::load;
10
+
11
+ /// True iff the ontology at `path` is consistent.
12
+ #[pyfunction]
13
+ pub(crate) fn is_consistent(path: &str) -> PyResult<bool> {
14
+ let ontology = load::load_path(path)?;
15
+ owl_dl_reasoner::is_consistent(&ontology).map_err(reason_error_to_py)
16
+ }
17
+
18
+ /// True iff `class_iri` is satisfiable (not ⊑ ⊥).
19
+ #[pyfunction]
20
+ pub(crate) fn is_class_satisfiable(path: &str, class_iri: &str) -> PyResult<bool> {
21
+ let ontology = load::load_path(path)?;
22
+ owl_dl_reasoner::is_class_satisfiable(&ontology, class_iri).map_err(reason_error_to_py)
23
+ }
24
+
25
+ /// True iff `sub ⊑ sup` is entailed.
26
+ #[pyfunction]
27
+ pub(crate) fn is_subclass_of(path: &str, sub: &str, sup: &str) -> PyResult<bool> {
28
+ let ontology = load::load_path(path)?;
29
+ owl_dl_reasoner::is_subclass_of(&ontology, sub, sup).map_err(reason_error_to_py)
30
+ }
31
+
32
+ /// True iff `individual_iri` is an instance of `class_iri`.
33
+ #[pyfunction]
34
+ pub(crate) fn is_instance_of(path: &str, class_iri: &str, individual_iri: &str) -> PyResult<bool> {
35
+ let ontology = load::load_path(path)?;
36
+ owl_dl_reasoner::is_instance_of(&ontology, class_iri, individual_iri)
37
+ .map_err(reason_error_to_py)
38
+ }
39
+
40
+ /// Named individuals entailed to be instances of `class_iri`.
41
+ #[pyfunction]
42
+ pub(crate) fn instances_of(path: &str, class_iri: &str) -> PyResult<Vec<String>> {
43
+ let ontology = load::load_path(path)?;
44
+ owl_dl_reasoner::instances_of(&ontology, class_iri).map_err(reason_error_to_py)
45
+ }
46
+
47
+ /// Map each named individual to its most-specific entailed types.
48
+ #[pyfunction]
49
+ pub(crate) fn realize(path: &str) -> PyResult<HashMap<String, Vec<String>>> {
50
+ let ontology = load::load_path(path)?;
51
+ let rs_realization = owl_dl_reasoner::realize(&ontology).map_err(reason_error_to_py)?;
52
+ Ok(realization_to_dict(&rs_realization))
53
+ }
54
+
55
+ fn realization_to_dict(realization: &owl_dl_reasoner::Realization) -> HashMap<String, Vec<String>> {
56
+ realization
57
+ .individuals()
58
+ .iter()
59
+ .map(|ind| (ind.clone(), realization.most_specific_types(ind).to_vec()))
60
+ .collect()
61
+ }
62
+
63
+ /// Entailed disjoint named-class pairs `(c, d)` — `C ⊓ D` is proven
64
+ /// unsatisfiable — plus a completeness flag. Bounded by a 1s per-pair
65
+ /// deadline. The Python-level wrapper (`__init__.py`) unpacks the tuple,
66
+ /// warns on `incomplete`, and returns just the pair list (see
67
+ /// `IncompleteQueryWarning`).
68
+ #[pyfunction]
69
+ pub(crate) fn disjoint_classes(path: &str) -> PyResult<(Vec<(String, String)>, bool)> {
70
+ let ontology = load::load_path(path)?;
71
+ owl_dl_reasoner::disjoint_classes(&ontology, Some(std::time::Duration::from_secs(1)))
72
+ .map(|d| (d.pairs().to_vec(), d.incomplete()))
73
+ .map_err(reason_error_to_py)
74
+ }
75
+
76
+ /// Told-disjoint object property pairs `(a, b)`.
77
+ #[pyfunction]
78
+ pub(crate) fn disjoint_object_properties(path: &str) -> PyResult<Vec<(String, String)>> {
79
+ let ontology = load::load_path(path)?;
80
+ owl_dl_reasoner::disjoint_object_properties(&ontology).map_err(reason_error_to_py)
81
+ }
82
+
83
+ /// Told-disjoint data property pairs `(a, b)`.
84
+ #[pyfunction]
85
+ pub(crate) fn disjoint_data_properties(path: &str) -> PyResult<Vec<(String, String)>> {
86
+ let ontology = load::load_path(path)?;
87
+ owl_dl_reasoner::disjoint_data_properties(&ontology).map_err(reason_error_to_py)
88
+ }
89
+
90
+ /// Inferred object property hierarchy: `(equivalent_groups, direct_subsumptions)`.
91
+ #[pyfunction]
92
+ #[allow(clippy::type_complexity)]
93
+ pub(crate) fn object_property_hierarchy(
94
+ path: &str,
95
+ ) -> PyResult<(Vec<Vec<String>>, Vec<(String, String)>)> {
96
+ let o = load::load_path(path)?;
97
+ let c = owl_dl_reasoner::classify_object_property_hierarchy(&o).map_err(reason_error_to_py)?;
98
+ Ok((
99
+ c.equivalent_groups().to_vec(),
100
+ c.direct_subsumptions().to_vec(),
101
+ ))
102
+ }
103
+
104
+ /// Inferred data property hierarchy: `(equivalent_groups, direct_subsumptions)`.
105
+ #[pyfunction]
106
+ #[allow(clippy::type_complexity)]
107
+ pub(crate) fn data_property_hierarchy(
108
+ path: &str,
109
+ ) -> PyResult<(Vec<Vec<String>>, Vec<(String, String)>)> {
110
+ let o = load::load_path(path)?;
111
+ let c = owl_dl_reasoner::classify_data_property_hierarchy(&o).map_err(reason_error_to_py)?;
112
+ Ok((
113
+ c.equivalent_groups().to_vec(),
114
+ c.direct_subsumptions().to_vec(),
115
+ ))
116
+ }
117
+
118
+ /// Entailed same-individual equivalence groups (asserted + functional-forced
119
+ /// + entailed), plus a completeness flag. Bounded by a 1s per-pair deadline.
120
+ /// See `disjoint_classes` for the tuple/wrapper convention.
121
+ #[pyfunction]
122
+ pub(crate) fn same_individuals(path: &str) -> PyResult<(Vec<Vec<String>>, bool)> {
123
+ let o = load::load_path(path)?;
124
+ owl_dl_reasoner::same_individuals(&o, Some(std::time::Duration::from_secs(1)))
125
+ .map(|s| (s.groups().to_vec(), s.incomplete()))
126
+ .map_err(reason_error_to_py)
127
+ }
128
+
129
+ /// Entailed different-individual pairs `(a, b)` — `{a} ⊓ {b}` is proven
130
+ /// unsatisfiable — plus a completeness flag. Bounded by a 1s per-pair
131
+ /// deadline. See `disjoint_classes` for the tuple/wrapper convention.
132
+ #[pyfunction]
133
+ pub(crate) fn different_individuals(path: &str) -> PyResult<(Vec<(String, String)>, bool)> {
134
+ let o = load::load_path(path)?;
135
+ owl_dl_reasoner::different_individuals(&o, Some(std::time::Duration::from_secs(1)))
136
+ .map(|d| (d.pairs().to_vec(), d.incomplete()))
137
+ .map_err(reason_error_to_py)
138
+ }
139
+
140
+ /// Inferred object property values `(subject, property, object)` over named
141
+ /// individuals, plus a completeness flag. Bounded by a 1s per-pair deadline.
142
+ /// See `disjoint_classes` for the tuple/wrapper convention.
143
+ #[pyfunction]
144
+ #[allow(clippy::type_complexity)]
145
+ pub(crate) fn object_property_values(
146
+ path: &str,
147
+ ) -> PyResult<(Vec<(String, String, String)>, bool)> {
148
+ let o = load::load_path(path)?;
149
+ owl_dl_reasoner::inferred_object_property_values(&o, Some(std::time::Duration::from_secs(1)))
150
+ .map(|v| (v.triples().to_vec(), v.incomplete()))
151
+ .map_err(reason_error_to_py)
152
+ }
153
+
154
+ /// Inferred data property values `(subject, property, lexical, datatype)`
155
+ /// over named individuals.
156
+ #[pyfunction]
157
+ #[allow(clippy::type_complexity)]
158
+ pub(crate) fn data_property_values(path: &str) -> PyResult<Vec<(String, String, String, String)>> {
159
+ let o = load::load_path(path)?;
160
+ owl_dl_reasoner::inferred_data_property_values(&o)
161
+ .map(|v| v.quads().to_vec())
162
+ .map_err(reason_error_to_py)
163
+ }
164
+
165
+ pub(crate) fn register(m: &Bound<'_, PyModule>) -> PyResult<()> {
166
+ m.add_function(wrap_pyfunction!(is_consistent, m)?)?;
167
+ m.add_function(wrap_pyfunction!(is_class_satisfiable, m)?)?;
168
+ m.add_function(wrap_pyfunction!(is_subclass_of, m)?)?;
169
+ m.add_function(wrap_pyfunction!(is_instance_of, m)?)?;
170
+ m.add_function(wrap_pyfunction!(instances_of, m)?)?;
171
+ m.add_function(wrap_pyfunction!(realize, m)?)?;
172
+ m.add_function(wrap_pyfunction!(disjoint_classes, m)?)?;
173
+ m.add_function(wrap_pyfunction!(disjoint_object_properties, m)?)?;
174
+ m.add_function(wrap_pyfunction!(disjoint_data_properties, m)?)?;
175
+ m.add_function(wrap_pyfunction!(object_property_hierarchy, m)?)?;
176
+ m.add_function(wrap_pyfunction!(data_property_hierarchy, m)?)?;
177
+ m.add_function(wrap_pyfunction!(same_individuals, m)?)?;
178
+ m.add_function(wrap_pyfunction!(different_individuals, m)?)?;
179
+ m.add_function(wrap_pyfunction!(object_property_values, m)?)?;
180
+ m.add_function(wrap_pyfunction!(data_property_values, m)?)?;
181
+ Ok(())
182
+ }
@@ -0,0 +1,171 @@
1
+ import rustdl
2
+ import pytest
3
+
4
+
5
+ def test_is_consistent_true(fixtures_dir):
6
+ fixture = fixtures_dir / "datatype" / "datatype_definition.ofn"
7
+ assert rustdl.is_consistent(str(fixture)) is True
8
+
9
+
10
+ def test_is_class_satisfiable_true(fixtures_dir):
11
+ fixture = fixtures_dir / "datatype" / "datatype_definition.ofn"
12
+ assert rustdl.is_class_satisfiable(str(fixture), "http://t/Person") is True
13
+
14
+
15
+ def test_is_subclass_of_direct(fixtures_dir):
16
+ fixture = fixtures_dir / "datatype" / "datatype_definition.ofn"
17
+ assert rustdl.is_subclass_of(str(fixture), "http://t/Adult", "http://t/Person") is True
18
+
19
+
20
+ def test_is_class_satisfiable_unknown_class_raises(fixtures_dir):
21
+ fixture = fixtures_dir / "datatype" / "datatype_definition.ofn"
22
+ with pytest.raises(rustdl.UnknownClassError):
23
+ rustdl.is_class_satisfiable(str(fixture), "http://t/NonExistent")
24
+
25
+
26
+ def test_is_instance_of_simple(fixtures_dir):
27
+ # p1_direct_bot has ClassAssertion(:Unsat :a)
28
+ fixture = fixtures_dir / "abox" / "p1_direct_bot.ofn"
29
+ assert rustdl.is_instance_of(str(fixture), "http://t/Unsat", "http://t/a") is True
30
+
31
+
32
+ def test_instances_of_simple(fixtures_dir):
33
+ fixture = fixtures_dir / "abox" / "p1_direct_bot.ofn"
34
+ instances = rustdl.instances_of(str(fixture), "http://t/Unsat")
35
+ assert "http://t/a" in instances
36
+
37
+
38
+ def test_realize_returns_dict(fixtures_dir):
39
+ fixture = fixtures_dir / "abox" / "p1_direct_bot.ofn"
40
+ realization = rustdl.realize(str(fixture))
41
+ assert isinstance(realization, dict)
42
+ assert "http://t/a" in realization
43
+ assert isinstance(realization["http://t/a"], list)
44
+
45
+
46
+ def test_disjoint_classes(tmp_path):
47
+ p = tmp_path / "o.ofn"
48
+ p.write_text(
49
+ "Prefix(:=<http://ex/#>)\n"
50
+ "Ontology(<http://ex/>\n"
51
+ " Declaration(Class(:A)) Declaration(Class(:B))\n"
52
+ " DisjointClasses(:A :B))\n"
53
+ )
54
+ pairs = rustdl.disjoint_classes(str(p))
55
+ assert ("http://ex/#A", "http://ex/#B") in pairs or ("http://ex/#B", "http://ex/#A") in pairs
56
+
57
+
58
+ def test_object_property_hierarchy_direct_subsumption(tmp_path):
59
+ p = tmp_path / "o.ofn"
60
+ p.write_text(
61
+ "Prefix(:=<http://ex/#>)\n"
62
+ "Ontology(<http://ex/>\n"
63
+ " Declaration(ObjectProperty(:r)) Declaration(ObjectProperty(:s))\n"
64
+ " SubObjectPropertyOf(:r :s))\n"
65
+ )
66
+ _equivalent_groups, direct_subsumptions = rustdl.object_property_hierarchy(str(p))
67
+ assert ("http://ex/#r", "http://ex/#s") in direct_subsumptions
68
+
69
+
70
+ def test_different_individuals(tmp_path):
71
+ p = tmp_path / "o.ofn"
72
+ p.write_text(
73
+ "Prefix(:=<http://ex/#>)\n"
74
+ "Ontology(<http://ex/>\n"
75
+ " Declaration(Class(:A)) Declaration(Class(:B))\n"
76
+ " Declaration(NamedIndividual(:a)) Declaration(NamedIndividual(:b))\n"
77
+ " DisjointClasses(:A :B)\n"
78
+ " ClassAssertion(:A :a) ClassAssertion(:B :b))\n"
79
+ )
80
+ pairs = rustdl.different_individuals(str(p))
81
+ assert ("http://ex/#a", "http://ex/#b") in pairs or ("http://ex/#b", "http://ex/#a") in pairs
82
+
83
+
84
+ def test_different_individuals_disjoint_types_is_complete(tmp_path, recwarn):
85
+ # Same disjoint-types shape as test_different_individuals: the extension
86
+ # probe resolves the (a, b) pair well within the 1s per-pair deadline, so
87
+ # `incomplete` stays False and no IncompleteQueryWarning is raised — the
88
+ # honesty signal is observable by its ABSENCE here.
89
+ p = tmp_path / "o.ofn"
90
+ p.write_text(
91
+ "Prefix(:=<http://ex/#>)\n"
92
+ "Ontology(<http://ex/>\n"
93
+ " Declaration(Class(:A)) Declaration(Class(:B))\n"
94
+ " Declaration(NamedIndividual(:a)) Declaration(NamedIndividual(:b))\n"
95
+ " DisjointClasses(:A :B)\n"
96
+ " ClassAssertion(:A :a) ClassAssertion(:B :b))\n"
97
+ )
98
+ rustdl.different_individuals(str(p))
99
+ assert not any(
100
+ issubclass(w.category, rustdl.IncompleteQueryWarning) for w in recwarn.list
101
+ )
102
+
103
+
104
+ def test_same_individuals(tmp_path):
105
+ p = tmp_path / "o.ofn"
106
+ p.write_text(
107
+ "Prefix(:=<http://ex/#>)\n"
108
+ "Ontology(<http://ex/>\n"
109
+ " Declaration(ObjectProperty(:r))\n"
110
+ " Declaration(NamedIndividual(:a)) Declaration(NamedIndividual(:b))\n"
111
+ " Declaration(NamedIndividual(:c))\n"
112
+ " FunctionalObjectProperty(:r)\n"
113
+ " ObjectPropertyAssertion(:r :a :b) ObjectPropertyAssertion(:r :a :c))\n"
114
+ )
115
+ groups = rustdl.same_individuals(str(p))
116
+ assert any(
117
+ "http://ex/#b" in group and "http://ex/#c" in group for group in groups
118
+ )
119
+
120
+
121
+ def test_same_individuals_extension_probe_warns_incomplete(tmp_path):
122
+ # Same fixture as test_same_individuals: :a is not related to :b/:c by the
123
+ # sound-complete seed (SameIndividual + functional-forced merge), so
124
+ # resolving (a, b) / (a, c) requires an extension probe — which always
125
+ # marks the result `incomplete`, per SameIndividuals::incomplete's
126
+ # doc ("true iff ... ANY extension probe ... was consulted").
127
+ p = tmp_path / "o.ofn"
128
+ p.write_text(
129
+ "Prefix(:=<http://ex/#>)\n"
130
+ "Ontology(<http://ex/>\n"
131
+ " Declaration(ObjectProperty(:r))\n"
132
+ " Declaration(NamedIndividual(:a)) Declaration(NamedIndividual(:b))\n"
133
+ " Declaration(NamedIndividual(:c))\n"
134
+ " FunctionalObjectProperty(:r)\n"
135
+ " ObjectPropertyAssertion(:r :a :b) ObjectPropertyAssertion(:r :a :c))\n"
136
+ )
137
+ with pytest.warns(rustdl.IncompleteQueryWarning):
138
+ groups = rustdl.same_individuals(str(p))
139
+ assert any(
140
+ "http://ex/#b" in group and "http://ex/#c" in group for group in groups
141
+ )
142
+
143
+
144
+ def test_object_property_values(tmp_path):
145
+ p = tmp_path / "o.ofn"
146
+ p.write_text(
147
+ "Prefix(:=<http://ex/#>)\n"
148
+ "Ontology(<http://ex/>\n"
149
+ " Declaration(ObjectProperty(:r))\n"
150
+ " Declaration(NamedIndividual(:a)) Declaration(NamedIndividual(:b))\n"
151
+ " SymmetricObjectProperty(:r)\n"
152
+ " ObjectPropertyAssertion(:r :a :b))\n"
153
+ )
154
+ triples = rustdl.object_property_values(str(p))
155
+ assert ("http://ex/#b", "http://ex/#r", "http://ex/#a") in triples
156
+
157
+
158
+ def test_data_property_values(tmp_path):
159
+ p = tmp_path / "o.ofn"
160
+ p.write_text(
161
+ "Prefix(:=<http://ex/#>)\n"
162
+ "Prefix(xsd:=<http://www.w3.org/2001/XMLSchema#>)\n"
163
+ "Ontology(<http://ex/>\n"
164
+ " Declaration(DataProperty(:dp))\n"
165
+ " Declaration(NamedIndividual(:a))\n"
166
+ " DataPropertyAssertion(:dp :a \"5\"^^xsd:integer))\n"
167
+ )
168
+ quads = rustdl.data_property_values(str(p))
169
+ assert any(
170
+ q[0] == "http://ex/#a" and q[1] == "http://ex/#dp" for q in quads
171
+ )
@@ -5,6 +5,7 @@
5
5
  [![license](https://img.shields.io/badge/license-Apache--2.0%20OR%20MIT-blue)](#licensing)
6
6
  [![Rust](https://img.shields.io/badge/Rust-1.88%2B-orange?logo=rust&logoColor=white)](https://www.rust-lang.org)
7
7
  [![Python](https://img.shields.io/badge/Python-3.10%2B-blue?logo=python&logoColor=white)](https://pypi.org/project/rustdl/)
8
+ [![Protégé plugin](https://img.shields.io/badge/Prot%C3%A9g%C3%A9-plugin-blue)](protege/README.md)
8
9
 
9
10
  A **sound** OWL 2 DL (SROIQ) reasoner in Rust. Konclude-style hybrid: a
10
11
  consequence-based **saturation** engine handles the EL-ish fragment, a
@@ -175,6 +176,27 @@ Any run that hits a bound prints a prominent `INCOMPLETE` warning to stderr.
175
176
  Diagnostics: `RUSTDL_TRACE=1` (one stderr line per search/branch decision);
176
177
  `RUSTDL_COUNTERS=1` with `--features counters` (per-rule call counts).
177
178
 
179
+ ## Protégé plugin
180
+
181
+ rustdl runs as a Protégé Desktop reasoner.
182
+
183
+ **Install:** download `rustdl-protege-<version>.jar` from the
184
+ [latest release](https://github.com/MaastrichtU-IDS/rustdl/releases/latest), drop
185
+ it into Protégé's `plugins/` directory, and restart. Choose **rustdl** under
186
+ Reasoner ▸, then Reasoner ▸ Start reasoner.
187
+
188
+ **Computes (v1):** consistency, the inferred class hierarchy, unsatisfiable
189
+ classes, and class assertions (types / instances). Property hierarchies & values,
190
+ same/different individuals, disjointness, and complex-class-expression queries
191
+ return empty for now.
192
+
193
+ **Config** (JVM system property, else env var): `-Drustdl.bin=…` / `RUSTDL_BIN`
194
+ for a specific binary; `-Drustdl.timeout.seconds=…` / `RUSTDL_TIMEOUT_SECONDS`
195
+ (default 600) for the per-call timeout.
196
+
197
+ Requires Protégé 5.6.x (Java 11+). Build-from-source and the full contract:
198
+ [`protege/README.md`](protege/README.md), [`docs/protege-plugin.md`](docs/protege-plugin.md).
199
+
178
200
  ## Licensing
179
201
 
180
202
  Dual-licensed [Apache-2.0](LICENSE-APACHE) **OR** [MIT](LICENSE-MIT). `horned-owl`