"""Create reasoning_engine
Generated by Phi-Octopus Eden
2025-11-08 02:17:59.290320
"""

```python
from typing import List, Dict


class KnowledgeBase:
    """A simple knowledge base class for storing facts and rules."""
    def __init__(self):
        self.facts = []
        self.rules = []

    def add_fact(self, fact: str) -> None:
        """Add a new fact to the knowledge base."""
        self.facts.append(fact)

    def add_rule(self, rule: str) -> None:
        """Add a new rule to the knowledge base."""
        self.rules.append(rule)


class ReasoningEngine:
    """A basic reasoning engine that can infer facts using rules and existing facts."""
    def __init__(self):
        self.kb = KnowledgeBase()

    def add_to_kb(self, fact: str) -> None:
        """Add a new fact to the knowledge base of the reasoning engine."""
        self.kb.add_fact(fact)

    def _match_rule(self, rule: str) -> List[str]:
        """Match a rule against existing facts and return matching fact indices."""
        left_side, right_side = rule.split(" => ")
        left_sides = [fact for fact in self.kb.facts if left_side in fact]
        return [i for i, fact in enumerate(self.kb.facts) if any(left_side in fact for left_side in left_sides)]

    def infer_new_facts(self) -> List[str]:
        """Infer new facts from the current knowledge base using existing rules."""
        inferred_facts = []
        for rule in self.kb.rules:
            matching_indices = self._match_rule(rule)
            if matching_indices:
                inferred_fact = " => ".join([self.kb.facts[i] for i in matching_indices])
                if inferred_fact not in self.kb.facts and inferred_fact not in [inf for inf in inferred_facts]:
                    inferred_facts.append(inferred_fact)
        return inferred_facts

    def reason(self) -> None:
        """Run the reasoning engine to infer new facts."""
        while True:
            new_facts = self.infer_new_facts()
            if not new_facts:
                break
            for fact in new_facts:
                print(f"Inferred: {fact}")
                self.kb.add_fact(fact)


# Example usage
if __name__ == "__main__":
    reasoning_engine = ReasoningEngine()

    # Adding facts and rules to the knowledge base
    reasoning_engine.add_to_kb("A => B")
    reasoning_engine.add_to_kb("B => C")
    reasoning_engine.add_to_kb("D")

    reasoning_engine.kb.rules.extend(["A", "B"])

    print("Starting inference process...")
    reasoning_engine.reason()
```

This code snippet introduces a `ReasoningEngine` class capable of performing basic inference on a set of facts and rules. It includes the ability to add facts and rules, match rules against existing facts, infer new facts, and continuously run the inference until no more new facts can be inferred.