Build a modus-ponens engine: apply MP to a fact set + rules repeatedly until no new fact appears (fixpoint), printing each derivation. Derive mortal(socrates).
Build a modus-ponens engine: apply MP to a fact set + rules repeatedly until no new fact appears (fixpoint), printing each derivation. Derive mortal(socrates).
Answer
def modus_ponens(facts, rules): facts = set(facts) while True: new = set() for antecedent, consequent in rules: if antecedent in facts and consequent not in facts: new.add(consequent) if not new: print('no new facts') return facts for f in sorted(new): print(f'derived: {f}') facts |= new facts = {'man(socrates)'} rules = [('man(socrates)', 'mortal(socrates)')] modus_ponens(facts, rules)