Beispiel #1
0
def test_function():
    e = Engine()
    m = e.modulewrapper

    def get_rules(chain):
        r = []
        while chain:
            r.append((chain.head, chain.body))
            chain = chain.next
        return r

    f = Function()
    r1 = Rule(C(1), C(2), m.user_module)
    r2 = Rule(C(2), C(3), m.user_module)
    r3 = Rule(C(0), C(0), m.user_module)
    r4 = Rule(C(15), C(-1), m.user_module)
    f.add_rule(r1, True)
    assert get_rules(f.rulechain) == [(C(1), C(2))]
    f.add_rule(r2, True)
    assert get_rules(f.rulechain) == [(C(1), C(2)), (C(2), C(3))]
    f.add_rule(r3, False)
    assert get_rules(f.rulechain) == [(C(0), C(0)), (C(1), C(2)), (C(2), C(3))]

    # test logical update view
    rulechain = f.rulechain
    f.add_rule(r4, True)
    assert get_rules(rulechain) == [(C(0), C(0)), (C(1), C(2)), (C(2), C(3))]
    assert get_rules(f.rulechain) == [(C(0), C(0)), (C(1), C(2)), (C(2), C(3)),
                                      (C(15), C(-1))]
Beispiel #2
0
def test_copy():

    e = Engine()
    m = e.modulewrapper
    l1 = Rule(
        C('a'), C('a1'), m.user_module,
        Rule(C('b'), C('b1'), m.user_module,
             Rule(C('c'), C('c1'), m.user_module)))
    l1c, _ = l1.copy()

    t1 = l1
    t2 = l1c
    while t1 is not None:
        assert t1 is not t2
        assert t1 == t2
        t1 = t1.next
        t2 = t2.next

    l0 = Rule(
        C(-1), C('a'), m.user_module,
        Rule(C(-2), C('b'), m.user_module,
             Rule(C(-3), C('c'), m.user_module, l1)))
    l0c, end = l0.copy(l1)
    t1 = l0
    t2 = l0c
    while t1 is not l1:
        assert t1 == t2
        assert t1 is not t2
        t1 = t1.next
        prev = t2
        t2 = t2.next
    assert t2 is l1
    assert prev is end
Beispiel #3
0
def test_copy():
 
    e = Engine()
    m = e.modulewrapper
    l1 = Rule(C('a'), C('a1'), m.user_module, Rule(C('b'), C('b1'),
            m.user_module, Rule(C('c'), C('c1'), m.user_module)))
    l1c, _ = l1.copy()

    t1 = l1
    t2 = l1c
    while t1 is not None:
        assert t1 is not t2
        assert t1 == t2
        t1 = t1.next
        t2 = t2.next

    l0 = Rule(C(-1), C('a'), m.user_module, Rule(C(-2), C('b'),
            m.user_module, Rule(C(-3), C('c'), m.user_module, l1)))
    l0c, end = l0.copy(l1)
    t1 = l0
    t2 = l0c
    while t1 is not l1:
        assert t1 == t2
        assert t1 is not t2
        t1 = t1.next
        prev = t2
        t2 = t2.next
    assert t2 is l1
    assert prev is end
Beispiel #4
0
 def make_rule(self, ruleterm, module):
     if helper.is_term(ruleterm):
         assert isinstance(ruleterm, Callable)
         if ruleterm.signature().eq(predsig):
             return Rule(ruleterm.argument_at(0), ruleterm.argument_at(1), module)
         else:
             return Rule(ruleterm, None, module)
     elif isinstance(ruleterm, Atom):
         return Rule(ruleterm, None, module)
     else:
         error.throw_type_error("callable", ruleterm)
Beispiel #5
0
def test_dont_clone_ground_arg():
    m = Engine().modulewrapper
    n = Number(1)
    n.unify_and_standardize_apart = None
    head = Callable.build("f", [n])
    r = Rule(head, C(2), m.user_module)
    assert r.groundargs == [True]

    b = BindingVar()
    callhead = Callable.build("f", [b])
    h = Heap()
    # should not fail, because ground args don't need cloning
    r.clone_and_unify_head(h, callhead)
Beispiel #6
0
def test_ground_args():
    e = Engine()
    m = e.modulewrapper
    r = Rule(C(1), C(2), m.user_module)
    assert r.groundargs is None

    head = Callable.build("f", [Number(1)])
    r = Rule(head, C(2), m.user_module)
    assert r.groundargs == [True]

    head = Callable.build("f", [
        Callable.build("g", [Number(1)]),
        BindingVar(),
        Callable.build("h", [Number(2), BindingVar()])
    ])
    r = Rule(head, C(2), m.user_module)
    assert r.groundargs == [True, False, False]