Spaces:
Runtime error
Runtime error
File size: 2,494 Bytes
2334dd3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
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
} |