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
        }