def assert_rule(new_rule): rule = facts_and_rules.rule(new_rule[0], new_rule[1]) rules.append(rule) # Check if this rule is triggered by any of our facts for fact in facts: support(infer(fact, rule), rule) # if this works, add new facts return rule
def infer_from_fact(fact): for r in RB: bindings = facts_and_rules.match(r.lhs[0], fact) if bindings != False: if len(r.lhs) == 1: fact_infered = facts_and_rules.statement(facts_and_rules.instantiate(r.rhs.full, bindings)) fact.add_fact(fact_infered) dup = False for f in KB: dup = dup | facts_and_rules.pattern_match(fact_infered, f) if not dup: Assert(fact_infered) print "fact" + fact.pretty() + "fact inferred" + fact_infered.pretty() else: tests = map(lambda x : facts_and_rules.instantiate(x.full, bindings), r.lhs[1:]) rhs = facts_and_rules.instantiate(r.rhs.full, bindings) new_rule = facts_and_rules.rule(tests, rhs) fact.add_rule(new_rule) Assert_Rule(new_rule) print "Hey there " + r.name + " matches " + fact.pretty()
def infer_from_rule(rule): for f in KB: bindings = facts_and_rules.match(rule.lhs[0], f) if bindings != False: if len(rule.lhs) == 1: new_statement = facts_and_rules.statement( facts_and_rules.instantiate(rule.rhs.full, bindings)) if rule.type == "Assert": f.add_fact(new_statement) assert_fact(new_statement) print "adding inference: " + str(new_statement.full) elif rule.type == "Retract": retract(new_statement) else: tests = map( lambda x: facts_and_rules.instantiate(x.full, bindings), rule.lhs[1:]) rhs = facts_and_rules.instantiate(rule.rhs.full, bindings) new_rule = facts_and_rules.rule(tests, rhs) rule.add_rule(new_rule) assert_rule(new_rule)
def remove_supports(fact): if fact in KB: print "Retracting: " + fact.pretty() for f in fact.facts: remove_supports(f) KB.remove(fact) def ask(pattern): for fact in KB: bindings_lists = [] bindings = facts_and_rules.match(pattern, fact) if bindings != False: bindings_lists.append(bindings) for b in bindings_lists: print "This is true: \t", print facts_and_rules.statement( facts_and_rules.instantiate(pattern.full, b)).pretty() for new_fact in facts: assert_fact(facts_and_rules.statement(new_fact)) for new_rule in rules: assert_rule(facts_and_rules.rule(new_rule[0], new_rule[1])) ask(facts_and_rules.statement(["flat", "?x"])) for f in KB: print f.pretty()