Ejemplo n.º 1
0
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()
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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()