Spaces:
Runtime error
Runtime error
import logging | |
import datetime | |
from typing import Dict, List, Union | |
class SymbolicReasoner: | |
""" | |
A symbolic logic engine for managing rules, facts, and inference. | |
Supports basic forward chaining, contradiction checks, and assertions. | |
""" | |
def __init__(self): | |
self.facts: Dict[str, bool] = {} | |
self.rules: List[Dict[str, Union[List[str], str]]] = [] | |
self.inference_log: List[Dict] = [] | |
logging.info("[SymbolicReasoner] Initialized.") | |
def add_fact(self, statement: str, value: bool = True): | |
if statement in self.facts and self.facts[statement] != value: | |
logging.warning(f"[SymbolicReasoner] Contradiction detected: {statement}") | |
raise ValueError(f"Contradiction: {statement} already known as {self.facts[statement]}") | |
self.facts[statement] = value | |
logging.info(f"[SymbolicReasoner] Fact added: {statement} = {value}") | |
self._evaluate_rules() | |
def add_rule(self, premises: List[str], conclusion: str): | |
rule = {"if": premises, "then": conclusion} | |
self.rules.append(rule) | |
logging.info(f"[SymbolicReasoner] Rule added: IF {premises} THEN {conclusion}") | |
self._evaluate_rules() | |
def _evaluate_rules(self): | |
inferred = True | |
while inferred: | |
inferred = False | |
for rule in self.rules: | |
if all(self.facts.get(prem, False) for prem in rule["if"]): | |
conclusion = rule["then"] | |
if conclusion not in self.facts: | |
self.facts[conclusion] = True | |
self.inference_log.append({ | |
"inferred": conclusion, | |
"based_on": rule["if"], | |
"timestamp": datetime.datetime.utcnow().isoformat() | |
}) | |
logging.info(f"[SymbolicReasoner] Inferred: {conclusion} from {rule['if']}") | |
inferred = True | |
def query(self, statement: str) -> bool: | |
result = self.facts.get(statement, False) | |
logging.info(f"[SymbolicReasoner] Query: {statement} = {result}") | |
return result | |
def explain(self, statement: str) -> List[Dict]: | |
return [entry for entry in self.inference_log if entry["inferred"] == statement] | |
def status(self): | |
return { | |
"facts": self.facts, | |
"rules": self.rules, | |
"inference_log": self.inference_log | |
} |