mirror of
https://github.com/semantica-agi/semantica.git
synced 2026-08-29 04:26:20 +00:00
- Robust ID extraction in CentralityCalculator, CommunityDetector, and ConnectivityAnalyzer - Support for direct Entity objects and dictionaries as node identifiers - Improved Entity hashability in utils/types.py - Added integration test to verify fix and prevent regression
81 lines
3.4 KiB
Python
81 lines
3.4 KiB
Python
import unittest
|
|
from semantica.reasoning.sparql_reasoner import SPARQLReasoner, SPARQLQueryResult
|
|
from semantica.reasoning.abductive_reasoner import AbductiveReasoner, Observation, HypothesisRanking
|
|
from semantica.reasoning.deductive_reasoner import DeductiveReasoner, Premise, Argument
|
|
from semantica.reasoning.reasoner import Rule
|
|
|
|
class TestSpecializedReasoners(unittest.TestCase):
|
|
def test_sparql_reasoner_expand_query(self):
|
|
reasoner = SPARQLReasoner()
|
|
reasoner.add_inference_rule("IF ?x is_a Person THEN ?x is_a Human")
|
|
|
|
query = "SELECT ?x WHERE { ?x a :Person . }"
|
|
expanded = reasoner.expand_query(query)
|
|
|
|
self.assertIn("Inference: Rule 1", expanded)
|
|
self.assertIn("?x a :Person . => ?x a :Human .", expanded)
|
|
|
|
def test_sparql_reasoner_infer_results(self):
|
|
reasoner = SPARQLReasoner()
|
|
reasoner.add_inference_rule("IF ?x is_a Person THEN ?x is_a Human")
|
|
|
|
results = SPARQLQueryResult(
|
|
bindings=[{"x": "John"}],
|
|
variables=["x"]
|
|
)
|
|
|
|
inferred = reasoner.infer_results(results)
|
|
self.assertEqual(len(inferred.bindings), 2)
|
|
# One original binding, one with type Human
|
|
binding_types = [b.get("x_type") for b in inferred.bindings]
|
|
self.assertIn("Human", binding_types)
|
|
|
|
def test_abductive_reasoner_generate_hypotheses(self):
|
|
reasoner = AbductiveReasoner()
|
|
reasoner.reasoner.add_rule("IF Disease(Flu) THEN Symptom(Fever)")
|
|
|
|
obs = Observation(observation_id="o1", description="Symptom(Fever)")
|
|
hypotheses = reasoner.generate_hypotheses([obs])
|
|
|
|
self.assertEqual(len(hypotheses), 1)
|
|
self.assertEqual(hypotheses[0].premises, ["Disease(Flu)"])
|
|
|
|
def test_abductive_reasoner_rank_hypotheses(self):
|
|
reasoner = AbductiveReasoner(ranking_strategy="simplicity")
|
|
|
|
h1 = reasoner.generate_hypotheses([Observation("o1", "Symptom(Fever)")]) # dummy, just to get objects
|
|
# Create custom hypotheses for testing ranking
|
|
from semantica.reasoning.abductive_reasoner import Hypothesis
|
|
hyp1 = Hypothesis("h1", "Expl 1", premises=["P1"], simplicity=0.5)
|
|
hyp2 = Hypothesis("h2", "Expl 2", premises=["P1", "P2"], simplicity=0.3)
|
|
|
|
ranked = reasoner.rank_hypotheses([hyp1, hyp2])
|
|
self.assertEqual(ranked[0].hypothesis_id, "h1") # simpler is better
|
|
|
|
def test_deductive_reasoner_apply_logic(self):
|
|
reasoner = DeductiveReasoner()
|
|
reasoner.reasoner.add_rule("IF Person(?x) AND Parent(?x, ?y) THEN Child(?y, ?x)")
|
|
|
|
premises = [
|
|
Premise("p1", "Person(John)"),
|
|
Premise("p2", "Parent(John, Jane)")
|
|
]
|
|
|
|
conclusions = reasoner.apply_logic(premises)
|
|
self.assertEqual(len(conclusions), 1)
|
|
self.assertEqual(conclusions[0].statement, "Child(Jane, John)")
|
|
|
|
def test_deductive_reasoner_prove_theorem(self):
|
|
reasoner = DeductiveReasoner()
|
|
reasoner.reasoner.add_rule("IF Person(?x) AND Parent(?x, ?y) THEN Child(?y, ?x)")
|
|
reasoner.add_facts(["Person(John)", "Parent(John, Jane)"])
|
|
|
|
proof = reasoner.prove_theorem("Child(Jane, John)")
|
|
self.assertTrue(proof.valid)
|
|
self.assertEqual(proof.theorem, "Child(Jane, John)")
|
|
self.assertEqual(len(proof.steps), 1)
|
|
self.assertEqual(proof.steps[0].statement, "Child(Jane, John)")
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|