rustdl 0.4.2__tar.gz → 0.4.4__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.
- {rustdl-0.4.2 → rustdl-0.4.4}/Cargo.lock +10 -10
- {rustdl-0.4.2 → rustdl-0.4.4}/Cargo.toml +7 -7
- {rustdl-0.4.2 → rustdl-0.4.4}/PKG-INFO +1 -1
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/README.md +22 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/clause.rs +33 -8
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-datatypes/README.md +22 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/src/load.rs +56 -20
- rustdl-0.4.4/crates/owl-dl-py/src/queries.rs +235 -0
- rustdl-0.4.4/crates/owl-dl-py/tests/python/test_queries.py +204 -0
- {rustdl-0.4.2/crates/owl-dl-saturation → rustdl-0.4.4/crates/owl-dl-reasoner}/README.md +22 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/abox_saturation.rs +88 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/src/class_expr_query.rs +230 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/src/disjointness.rs +184 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/src/individuals.rs +241 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/lib.rs +358 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/src/property_classify.rs +106 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/src/property_values.rs +498 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/class_expr.rs +135 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/class_expr_oracle.rs +182 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/disjoint_nodecap.rs +100 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/disjoint_oracle.rs +213 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/disjoint_union_covering.rs +154 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/class_expr/ce-materialized.owx +92 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/class_expr/ce.ofn +12 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/disjoint/dj-disjoint.owx +71 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/disjoint/dj.ofn +16 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/individuals/inds.ofn +30 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/property_values/pv-materialized.owx +127 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/fixtures/property_values/pv.ofn +19 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/individuals_nodecap.rs +93 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/individuals_oracle.rs +310 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/property_hierarchy.rs +112 -0
- rustdl-0.4.4/crates/owl-dl-reasoner/tests/property_values_oracle.rs +456 -0
- {rustdl-0.4.2/crates/owl-dl-reasoner → rustdl-0.4.4/crates/owl-dl-saturation}/README.md +22 -0
- rustdl-0.4.4/crates/owl-dl-tableau/README.md +205 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/__init__.py +116 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/__init__.pyi +81 -0
- rustdl-0.4.2/crates/owl-dl-py/src/queries.rs +0 -71
- rustdl-0.4.2/crates/owl-dl-py/tests/python/test_queries.py +0 -43
- rustdl-0.4.2/crates/owl-dl-tableau/README.md +0 -183
- {rustdl-0.4.2 → rustdl-0.4.4}/README.md +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/Cargo.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/absorb.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/approx_saturation.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/convert.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/convert_back.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/data_axioms.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/definitions.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/disjunction_existential.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/disjunctive_antecedent.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/ir.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/lib.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/locality.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/normalize.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/ontology.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/residual_trigger.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/role_hierarchy.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/told.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/transform.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/src/vocab.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/tests/concept_pool_proptest.proptest-regressions +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/tests/concept_pool_proptest.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/tests/convert_round_trip_proptest.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-core/tests/role_hierarchy_proptest.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-datatypes/Cargo.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-datatypes/src/lib.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/.gitignore +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/Cargo.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/README.md +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/.gitignore +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/README.md +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/__init__.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/fixtures/recorded_replies_clash.json +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/fixtures/seed.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/gate.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/llm.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/loop.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out/candidate.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out/current.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out/metrics.md +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out/transcript.jsonl +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out-clash/candidate.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out-clash/current.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out-clash/metrics.md +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/out-clash/transcript.jsonl +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/requirements.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/run.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/tests/__init__.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/tests/test_gate.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/tests/test_llm.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/tests/test_loop.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/tests/test_run.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/examples/nesy_loop/tests/test_seed.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/src/classify.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/src/errors.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/src/explain.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/src/lib.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/src/materialize.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/conftest.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_classify.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_examples.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_explain.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_manchester.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_materialize.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_results.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_smoke.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_soundness.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_stubs.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-py/tests/python/test_tutorial.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/Cargo.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/examples/embed_classify.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/abox_check.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/classify.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/diagnose.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/justify.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/laconic.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/model_cache.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/oracle_diff.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/realize.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/repair.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/src/union_find.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/abox_chain_index.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/abox_consistency.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/abox_disjoint_index.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/abox_sat_fp_probe.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/abox_saturation.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/adaptive_budget.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/anon349_diagnostic.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/anonymous_individuals_identity.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/anonymous_individuals_reporting.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/approx_saturation_forced_disjunct.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/backfold.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/backjump_precision_gate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/bjgap_dl_tail.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/blocked_disjunction_soundness.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/blocked_disjunction_termination.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/cardinality_disjunct_atoms.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/classify_concrete_domain.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/classify_defined_sweep.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/classify_inverse_domain.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/completeness_contract.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/concrete_domain_clash.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/data_properties.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/data_property_assertions.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/datatype_completeness.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/datatype_inconsistency.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/datatype_value_membership.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/decide_pair_probe.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/diagnose_partition.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/disjunctive_existential_marker_fp.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/domain_gci_completeness.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/existential_successors.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/exists_top_filler.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p1_direct_bot.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p1_no_bot.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p2_disjoint_different_individuals.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p2_disjoint_types.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_neg_opa.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_neg_opa_no_clash.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_role_hierarchy_neg_consistent.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p3_role_hierarchy_neg_inconsistent.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p4_same_different.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p4_same_without_different.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p5_functional_diff.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p5_functional_same_target.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_asymmetric.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_asymmetric_one_way.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_irreflexive.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p6_irreflexive_distinct.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p7_range_compatible.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/abox/p7_range_disjoint.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_cardinality_disjoint.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_property_domain-classified.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/data_property_domain.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_definition-classified.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_definition.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/datatype_facet.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/functional_data_property.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/sub_data_property-classified.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/datatype/sub_data_property.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/functional-equiv-some-bug.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/materialize/rbox-materialized.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/materialize/rbox.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/named-pizza-country-bug.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-01.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-02.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-03.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-04.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-05.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-06.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-07.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/p2b0-terms-08.txt +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_01.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_02.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_03.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_04.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_05.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_06.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_07.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.hermit.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/pair_08.owx +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/phase2b/phase2b-verdicts.log +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/regression/chain_closure_consistent.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/regression/issue35_nominal_cycle_hang.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/regression/issue35_tableau_depth_hang.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/fixtures/regression/realize_inconsistent.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/funcmerge_inverse.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/funcmerge_scaling.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/functional_enforcement.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/inverse_cardinality_soundness.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/inverse_symmetric_domain.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/issue35_nominal_cycle_hang.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/issue35_tableau_depth_hang.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/justification.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/konclude_closure_diff.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/label_heuristic_canary.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/laconic_justification.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/materialize_oracle.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/node_cap.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/nominal_cardinality_realize.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/object_has_self_domain.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/phase2c_pair_06_canary.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/precompletion_probe_gate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/property_assertions.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/real_ontology_corpus.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/realize_inconsistent_shortcircuit.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/repair_suggestions.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/sat_lookahead_gate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/saturator_disjointness.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/seed_probe_gate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/shadow_dep_gate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/snapshot_phase0_canary.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/sp2_nogood_gate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/sparse_classification_identity.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/subproperty_axioms.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/tautology_skip_canary.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/tbox_only_classify.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/top_subsumes_all.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/value_type_disjoint_canary.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/value_type_disjoint_probe.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-reasoner/tests/wedge_consistency.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-saturation/Cargo.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-saturation/src/lib.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-saturation/src/proof.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-saturation/src/seed_sat.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-saturation/tests/fixtures/phase2a_functional_role_canary.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-saturation/tests/fixtures/phase2b_compound_existential_canary.ofn +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/Cargo.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/counters.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/deps.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/graph.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/hyper.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/lib.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/replay.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/rules.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/saturate.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/search.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/shadow_measures.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/snapshot.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/src/trail.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/backprop_risk.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/nominal_first_bounded.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/nominal_first_bounded_divergence_canary.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/replay_driver.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/replay_roundtrip.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/sat_lookahead_drop.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/semantic_branching.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/shadow_dep_probe.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/crates/owl-dl-tableau/tests/snapshot_capture.rs +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/pyproject.toml +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/_results.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/data/pizza.owl.gz +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/data/sio.owl.gz +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/data/sulo.owl.gz +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/python/rustdl/examples.py +0 -0
- {rustdl-0.4.2 → rustdl-0.4.4}/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.
|
|
1021
|
+
version = "0.4.4"
|
|
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.
|
|
1041
|
+
version = "0.4.4"
|
|
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.
|
|
1049
|
+
version = "0.4.4"
|
|
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.
|
|
1064
|
+
version = "0.4.4"
|
|
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.
|
|
1078
|
+
version = "0.4.4"
|
|
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.
|
|
1088
|
+
version = "0.4.4"
|
|
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.
|
|
1099
|
+
version = "0.4.4"
|
|
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.
|
|
1117
|
+
version = "0.4.4"
|
|
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.
|
|
1133
|
+
version = "0.4.4"
|
|
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.
|
|
2559
|
+
version = "0.4.4"
|
|
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.
|
|
6
|
+
version = "0.4.4"
|
|
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.
|
|
19
|
-
owl-dl-saturation = { path = "crates/owl-dl-saturation", version = "0.4.
|
|
20
|
-
owl-dl-tableau = { path = "crates/owl-dl-tableau", version = "0.4.
|
|
21
|
-
owl-dl-datatypes = { path = "crates/owl-dl-datatypes", version = "0.4.
|
|
22
|
-
owl-dl-cb = { path = "crates/owl-dl-cb", version = "0.4.
|
|
23
|
-
owl-dl-reasoner = { path = "crates/owl-dl-reasoner", version = "0.4.
|
|
18
|
+
owl-dl-core = { path = "crates/owl-dl-core", version = "0.4.4" }
|
|
19
|
+
owl-dl-saturation = { path = "crates/owl-dl-saturation", version = "0.4.4" }
|
|
20
|
+
owl-dl-tableau = { path = "crates/owl-dl-tableau", version = "0.4.4" }
|
|
21
|
+
owl-dl-datatypes = { path = "crates/owl-dl-datatypes", version = "0.4.4" }
|
|
22
|
+
owl-dl-cb = { path = "crates/owl-dl-cb", version = "0.4.4" }
|
|
23
|
+
owl-dl-reasoner = { path = "crates/owl-dl-reasoner", version = "0.4.4" }
|
|
24
24
|
|
|
25
25
|
horned-owl = { version = "1.4", default-features = false }
|
|
26
26
|
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
[](#licensing)
|
|
6
6
|
[](https://www.rust-lang.org)
|
|
7
7
|
[](https://pypi.org/project/rustdl/)
|
|
8
|
+
[](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`
|
|
@@ -273,14 +273,10 @@ impl Clausifier {
|
|
|
273
273
|
}
|
|
274
274
|
}
|
|
275
275
|
Axiom::DisjointUnion { class, members } => {
|
|
276
|
-
// class ≡ ⊔members
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
//
|
|
280
|
-
// approximate via the union concept if present is
|
|
281
|
-
// complex; defer the equivalence half, emit the
|
|
282
|
-
// pairwise disjointness which is the load-bearing
|
|
283
|
-
// part for unsat detection.
|
|
276
|
+
// class ≡ ⊔members: pairwise disjoint members, each
|
|
277
|
+
// member ⊑ class (Horn), and the covering half
|
|
278
|
+
// class ⊑ ⊔members (a genuine disjunctive-head
|
|
279
|
+
// clause — see the design doc for #40).
|
|
284
280
|
for i in 0..members.len() {
|
|
285
281
|
for j in (i + 1)..members.len() {
|
|
286
282
|
self.next_var = X + 1;
|
|
@@ -315,6 +311,35 @@ impl Clausifier {
|
|
|
315
311
|
self.defer("disjoint-union-member");
|
|
316
312
|
}
|
|
317
313
|
}
|
|
314
|
+
// class ⊑ ⊔members (the previously-deferred covering
|
|
315
|
+
// half): C(X) → D1(X) ∨ … ∨ Dn(X). Sound — a genuine
|
|
316
|
+
// DisjointUnion entailment, so it can only add true
|
|
317
|
+
// subsumptions, never an FP.
|
|
318
|
+
self.next_var = X + 1;
|
|
319
|
+
let mut head = Vec::with_capacity(members.len());
|
|
320
|
+
let mut all_atomic = true;
|
|
321
|
+
for &m in members {
|
|
322
|
+
if let Some(cid) = self.class_id_of(m) {
|
|
323
|
+
head.push(Atom::Class(cid, X));
|
|
324
|
+
} else {
|
|
325
|
+
// Complex member: sound under-approximation —
|
|
326
|
+
// defer the covering clause rather than emit
|
|
327
|
+
// it with a missing disjunct (which would be
|
|
328
|
+
// an unsound *narrower* union).
|
|
329
|
+
all_atomic = false;
|
|
330
|
+
break;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
if all_atomic {
|
|
334
|
+
// Empty members ⇒ head == [] ⇒ `C ⊑ ⊥` (empty
|
|
335
|
+
// union), matching the ⊥-clause convention.
|
|
336
|
+
self.clauses.push(DlClause {
|
|
337
|
+
body: vec![Atom::Class(*class, X)],
|
|
338
|
+
head,
|
|
339
|
+
});
|
|
340
|
+
} else {
|
|
341
|
+
self.defer("disjoint-union-covering");
|
|
342
|
+
}
|
|
318
343
|
}
|
|
319
344
|
Axiom::ObjectPropertyDomain { role, domain } => {
|
|
320
345
|
// ∃role.⊤ ⊑ domain → role(x,y) → domain(x)
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
[](#licensing)
|
|
6
6
|
[](https://www.rust-lang.org)
|
|
7
7
|
[](https://pypi.org/project/rustdl/)
|
|
8
|
+
[](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`
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
//! Parse OWL ontologies from a file path or bytes, mapping
|
|
2
2
|
//! horned-owl parse errors to `ParseError`.
|
|
3
3
|
|
|
4
|
+
use horned_owl::curie::PrefixMapping;
|
|
4
5
|
use horned_owl::io::ParserConfiguration;
|
|
5
6
|
use horned_owl::io::ofn::reader::read as read_ofn;
|
|
6
7
|
use horned_owl::io::omn::reader::read as read_omn;
|
|
@@ -14,34 +15,47 @@ use std::path::Path;
|
|
|
14
15
|
|
|
15
16
|
use crate::errors::ParseError;
|
|
16
17
|
|
|
18
|
+
/// Detect the parse format from a file path's extension
|
|
19
|
+
/// (`.ofn` | `.owx` | `.rdf` | `.owl` | `.omn`).
|
|
20
|
+
fn format_from_path(path: &str) -> PyResult<&'static str> {
|
|
21
|
+
let ext = Path::new(path)
|
|
22
|
+
.extension()
|
|
23
|
+
.and_then(|s| s.to_str())
|
|
24
|
+
.map(str::to_ascii_lowercase);
|
|
25
|
+
match ext.as_deref() {
|
|
26
|
+
Some("ofn") => Ok("ofn"),
|
|
27
|
+
Some("owx") => Ok("owx"),
|
|
28
|
+
Some("rdf" | "owl") => Ok("rdf-xml"),
|
|
29
|
+
Some("omn") => Ok("omn"),
|
|
30
|
+
Some(other) => Err(ParseError::new_err(format!(
|
|
31
|
+
"unknown extension `.{other}` — pass format= explicitly via classify_bytes() or rename file to .ofn / .owx / .rdf / .omn"
|
|
32
|
+
))),
|
|
33
|
+
None => Err(ParseError::new_err(format!(
|
|
34
|
+
"no extension on `{path}` — pass format= explicitly via classify_bytes()"
|
|
35
|
+
))),
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
17
39
|
/// Parse an ontology from a file path. Format is auto-detected from
|
|
18
40
|
/// the file extension (`.ofn` | `.owx` | `.rdf` | `.owl` | `.omn`).
|
|
19
41
|
pub(crate) fn load_path(path: &str) -> PyResult<SetOntology<RcStr>> {
|
|
20
42
|
let src = std::fs::read_to_string(path)
|
|
21
43
|
.map_err(|e| ParseError::new_err(format!("read {path}: {e}")))?;
|
|
22
|
-
let
|
|
23
|
-
.extension()
|
|
24
|
-
.and_then(|s| s.to_str())
|
|
25
|
-
.map(str::to_ascii_lowercase);
|
|
26
|
-
let format = match ext.as_deref() {
|
|
27
|
-
Some("ofn") => "ofn",
|
|
28
|
-
Some("owx") => "owx",
|
|
29
|
-
Some("rdf" | "owl") => "rdf-xml",
|
|
30
|
-
Some("omn") => "omn",
|
|
31
|
-
Some(other) => {
|
|
32
|
-
return Err(ParseError::new_err(format!(
|
|
33
|
-
"unknown extension `.{other}` — pass format= explicitly via classify_bytes() or rename file to .ofn / .owx / .rdf / .omn"
|
|
34
|
-
)));
|
|
35
|
-
}
|
|
36
|
-
None => {
|
|
37
|
-
return Err(ParseError::new_err(format!(
|
|
38
|
-
"no extension on `{path}` — pass format= explicitly via classify_bytes()"
|
|
39
|
-
)));
|
|
40
|
-
}
|
|
41
|
-
};
|
|
44
|
+
let format = format_from_path(path)?;
|
|
42
45
|
parse_with_format(&src, format)
|
|
43
46
|
}
|
|
44
47
|
|
|
48
|
+
/// Like [`load_path`], but also returns the [`PrefixMapping`] the OFN/OWX/OMN
|
|
49
|
+
/// reader collected — used to resolve Manchester class-expression strings
|
|
50
|
+
/// (e.g. `:A`) against the ontology's own prefixes. The RDF/XML reader does
|
|
51
|
+
/// not expose a prefix map, so that path returns `PrefixMapping::default()`.
|
|
52
|
+
pub(crate) fn load_path_with_pm(path: &str) -> PyResult<(SetOntology<RcStr>, PrefixMapping)> {
|
|
53
|
+
let src = std::fs::read_to_string(path)
|
|
54
|
+
.map_err(|e| ParseError::new_err(format!("read {path}: {e}")))?;
|
|
55
|
+
let format = format_from_path(path)?;
|
|
56
|
+
parse_with_format_pm(&src, format)
|
|
57
|
+
}
|
|
58
|
+
|
|
45
59
|
/// Parse from bytes with an explicit format string.
|
|
46
60
|
pub(crate) fn load_bytes(data: &[u8], format: &str) -> PyResult<SetOntology<RcStr>> {
|
|
47
61
|
let src = std::str::from_utf8(data)
|
|
@@ -49,6 +63,28 @@ pub(crate) fn load_bytes(data: &[u8], format: &str) -> PyResult<SetOntology<RcSt
|
|
|
49
63
|
parse_with_format(src, format)
|
|
50
64
|
}
|
|
51
65
|
|
|
66
|
+
fn parse_with_format_pm(src: &str, format: &str) -> PyResult<(SetOntology<RcStr>, PrefixMapping)> {
|
|
67
|
+
let mut reader = Cursor::new(src);
|
|
68
|
+
let cfg = ParserConfiguration::default();
|
|
69
|
+
let result = match format {
|
|
70
|
+
"ofn" => read_ofn(&mut reader, cfg).map(|(o, pm): (SetOntology<RcStr>, _)| (o, pm)),
|
|
71
|
+
"owx" => read_owx(&mut reader, cfg).map(|(o, pm): (SetOntology<RcStr>, _)| (o, pm)),
|
|
72
|
+
// rdf::reader::read exposes no PrefixMapping; use the default (empty) one.
|
|
73
|
+
"rdf-xml" | "rdf" => {
|
|
74
|
+
read_rdf(&mut reader, cfg).map(|(o, _)| (o.into(), PrefixMapping::default()))
|
|
75
|
+
}
|
|
76
|
+
"omn" | "manchester" => {
|
|
77
|
+
read_omn(&mut reader, cfg).map(|(o, pm): (SetOntology<RcStr>, _)| (o, pm))
|
|
78
|
+
}
|
|
79
|
+
other => {
|
|
80
|
+
return Err(ParseError::new_err(format!(
|
|
81
|
+
"unknown format `{other}` — expected one of: ofn, owx, rdf-xml, omn"
|
|
82
|
+
)));
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
result.map_err(|e| ParseError::new_err(format!("parse {format}: {e}")))
|
|
86
|
+
}
|
|
87
|
+
|
|
52
88
|
fn parse_with_format(src: &str, format: &str) -> PyResult<SetOntology<RcStr>> {
|
|
53
89
|
let mut reader = Cursor::new(src);
|
|
54
90
|
let cfg = ParserConfiguration::default();
|
|
@@ -0,0 +1,235 @@
|
|
|
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
|
+
/// Parse a Manchester-syntax class expression against the ontology's own
|
|
166
|
+
/// prefix map (so e.g. `:A` resolves via the file's `Prefix(:=...)`).
|
|
167
|
+
fn parse_ce(
|
|
168
|
+
ce: &str,
|
|
169
|
+
pm: &horned_owl::curie::PrefixMapping,
|
|
170
|
+
build: &horned_owl::model::Build<horned_owl::model::RcStr>,
|
|
171
|
+
) -> PyResult<horned_owl::model::ClassExpression<horned_owl::model::RcStr>> {
|
|
172
|
+
horned_owl::io::omn::reader::parse_class_expression(ce, pm, build)
|
|
173
|
+
.map_err(|e| pyo3::exceptions::PyValueError::new_err(format!("class expression: {e}")))
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/// Is `ce` satisfiable w.r.t. the ontology at `path`? Plus a completeness
|
|
177
|
+
/// flag. See `disjoint_classes` for the tuple/wrapper convention.
|
|
178
|
+
#[pyfunction]
|
|
179
|
+
pub(crate) fn class_expression_satisfiable(path: &str, ce: &str) -> PyResult<(bool, bool)> {
|
|
180
|
+
let (o, pm) = load::load_path_with_pm(path)?;
|
|
181
|
+
let build: horned_owl::model::Build<horned_owl::model::RcStr> = horned_owl::model::Build::new();
|
|
182
|
+
let ce = parse_ce(ce, &pm, &build)?;
|
|
183
|
+
let v = owl_dl_reasoner::class_expression_satisfiable(&o, &ce).map_err(reason_error_to_py)?;
|
|
184
|
+
Ok((v.holds(), v.incomplete()))
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/// Is `sub_ce ⊑ sup_ce` entailed w.r.t. the ontology at `path`? Plus a
|
|
188
|
+
/// completeness flag. See `disjoint_classes` for the tuple/wrapper convention.
|
|
189
|
+
#[pyfunction]
|
|
190
|
+
pub(crate) fn class_expression_entailed_subclass(
|
|
191
|
+
path: &str,
|
|
192
|
+
sub_ce: &str,
|
|
193
|
+
sup_ce: &str,
|
|
194
|
+
) -> PyResult<(bool, bool)> {
|
|
195
|
+
let (o, pm) = load::load_path_with_pm(path)?;
|
|
196
|
+
let build: horned_owl::model::Build<horned_owl::model::RcStr> = horned_owl::model::Build::new();
|
|
197
|
+
let sub_ce = parse_ce(sub_ce, &pm, &build)?;
|
|
198
|
+
let sup_ce = parse_ce(sup_ce, &pm, &build)?;
|
|
199
|
+
let v = owl_dl_reasoner::class_expression_entailed_subclass(&o, &sub_ce, &sup_ce)
|
|
200
|
+
.map_err(reason_error_to_py)?;
|
|
201
|
+
Ok((v.holds(), v.incomplete()))
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/// Named individuals provably in `ce` w.r.t. the ontology at `path`, plus a
|
|
205
|
+
/// completeness flag. See `disjoint_classes` for the tuple/wrapper convention.
|
|
206
|
+
#[pyfunction]
|
|
207
|
+
pub(crate) fn class_expression_instances(path: &str, ce: &str) -> PyResult<(Vec<String>, bool)> {
|
|
208
|
+
let (o, pm) = load::load_path_with_pm(path)?;
|
|
209
|
+
let build: horned_owl::model::Build<horned_owl::model::RcStr> = horned_owl::model::Build::new();
|
|
210
|
+
let ce = parse_ce(ce, &pm, &build)?;
|
|
211
|
+
let r = owl_dl_reasoner::class_expression_instances(&o, &ce).map_err(reason_error_to_py)?;
|
|
212
|
+
Ok((r.individuals().to_vec(), r.incomplete()))
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
pub(crate) fn register(m: &Bound<'_, PyModule>) -> PyResult<()> {
|
|
216
|
+
m.add_function(wrap_pyfunction!(is_consistent, m)?)?;
|
|
217
|
+
m.add_function(wrap_pyfunction!(is_class_satisfiable, m)?)?;
|
|
218
|
+
m.add_function(wrap_pyfunction!(is_subclass_of, m)?)?;
|
|
219
|
+
m.add_function(wrap_pyfunction!(is_instance_of, m)?)?;
|
|
220
|
+
m.add_function(wrap_pyfunction!(instances_of, m)?)?;
|
|
221
|
+
m.add_function(wrap_pyfunction!(realize, m)?)?;
|
|
222
|
+
m.add_function(wrap_pyfunction!(disjoint_classes, m)?)?;
|
|
223
|
+
m.add_function(wrap_pyfunction!(disjoint_object_properties, m)?)?;
|
|
224
|
+
m.add_function(wrap_pyfunction!(disjoint_data_properties, m)?)?;
|
|
225
|
+
m.add_function(wrap_pyfunction!(object_property_hierarchy, m)?)?;
|
|
226
|
+
m.add_function(wrap_pyfunction!(data_property_hierarchy, m)?)?;
|
|
227
|
+
m.add_function(wrap_pyfunction!(same_individuals, m)?)?;
|
|
228
|
+
m.add_function(wrap_pyfunction!(different_individuals, m)?)?;
|
|
229
|
+
m.add_function(wrap_pyfunction!(object_property_values, m)?)?;
|
|
230
|
+
m.add_function(wrap_pyfunction!(data_property_values, m)?)?;
|
|
231
|
+
m.add_function(wrap_pyfunction!(class_expression_satisfiable, m)?)?;
|
|
232
|
+
m.add_function(wrap_pyfunction!(class_expression_entailed_subclass, m)?)?;
|
|
233
|
+
m.add_function(wrap_pyfunction!(class_expression_instances, m)?)?;
|
|
234
|
+
Ok(())
|
|
235
|
+
}
|