rules = [
    Rule("R1", frozenset({"fever", "rash"}), "measles_suspected", 0.8),
    Rule("R2", frozenset({"fever", "cough"}), "flu_suspected", 0.7),
    Rule("R3", frozenset({"measles_suspected", "koplik_spots"}),
         "measles_confirmed", 0.95),
    Rule("R4", frozenset({"flu_suspected", "body_ache"}),
         "flu_confirmed", 0.85),
]

if __name__ == "__main__":
    observed_facts = {"fever", "rash", "koplik_spots"}

    print("Forward chaining:")
    derived = forward_chain(observed_facts, rules)
    for fact, cf in sorted(derived.items(), key=lambda kv: -kv[1]):
        if fact not in observed_facts:
            print(f"  {fact}: CF={cf:.2f}")

    print("\nBackward chaining (goal: measles_confirmed):")
    trace: List[str] = []
    result = backward_chain(
        "measles_confirmed", observed_facts, rules, trace
    )
    for line in trace:
        print(" ", line)
    print("  Result:", result)
