def test_enumerate_vars_head_body():
    from prolog.interpreter.memo import EnumerationMemo
    A = BindingVar()  # single, head
    B = BindingVar()  # double, head
    C = BindingVar()  # both
    D = BindingVar()  # single, body
    E = BindingVar()  # double, body
    head = Callable.build("f", [A, B, B, C])
    body = Callable.build("g", [C, D, E, E])
    memo = EnumerationMemo()
    head = head.enumerate_vars(memo)
    memo.in_head = False
    body = body.enumerate_vars(memo)
    memo.assign_numbers()

    h1, h2, h3, h4 = head.arguments()
    assert h1.num == -1
    assert h2 is h3
    assert h2.num == 1
    assert h4.num == 0
    b1, b2, b3, b4 = body.arguments()
    assert b1 is h4
    assert b2.num == -1
    assert b3 is b4
    assert b3.num == 1
Exemple #2
0
    def __init__(self, head, body, module, next = None):
        from prolog.interpreter import helper
        head = head.dereference(None)
        assert isinstance(head, Callable)
        memo = EnumerationMemo()
        self.head = h = head.enumerate_vars(memo)
        if h.argument_count() > 0:
            self.headargs = h.arguments()
        else:
            self.headargs = None
        if body is not None:
            body = body.dereference(None)
            body = helper.ensure_callable(body)
            self.body = body.enumerate_vars(memo)
        else:
            self.body = None
        self.size_env = memo.size()
        self.signature = head.signature()        
        self.module = module
        self.next = next
        self.file_name = "<unknown>"
        self.line_range = None
        self.source = None

        self._does_contain_cut()
def test_enumerate_vars_of_bound_var():
    from prolog.interpreter.memo import EnumerationMemo
    h = Heap()
    X = h.newvar()
    X.setvalue(Callable.build("a"), h)
    t1 = Callable.build("f", [X])
    memo = EnumerationMemo()
    t2 = t1.enumerate_vars(memo)
    memo.assign_numbers()
    assert is_term(t2)
    assert t2.signature().eq(t1.signature())
    assert t1.argument_at(0).dereference(None) is t2.argument_at(0)
def test_enumerate_vars():
    from prolog.interpreter.memo import EnumerationMemo
    X = BindingVar()
    Y = BindingVar()
    t1 = Callable.build("f", [X, X, Callable.build("g", [Y, X])])
    memo = EnumerationMemo()
    t2 = t1.enumerate_vars(memo)
    memo.assign_numbers()
    assert is_term(t2)
    assert t2.signature().eq(t1.signature())
    assert t2.argument_at(0) is t2.argument_at(1)
    assert t2.argument_at(0).num == 0
    assert t2.argument_at(2).argument_at(1).num == 0
def test_enumerate_vars_var_occurs_once():
    from prolog.interpreter.memo import EnumerationMemo
    X = BindingVar()
    Y = BindingVar()
    Z = BindingVar()
    t1 = Callable.build("f", [X, Y, Y, Z, Z])
    memo = EnumerationMemo()
    t2 = t1.enumerate_vars(memo)
    memo.assign_numbers()
    a1, a2, a3, a4, a5 = t2.arguments()
    assert a1.num == -1
    if a2.num == 0:
        assert a3.num == 0
        assert a4.num == 1
        assert a5.num == 1
    else:
        assert a2.num == a3.num == 1
        assert a4.num == a5.num == 0
Exemple #6
0
def test_enumerate_vars_var_occurs_once():
    from prolog.interpreter.memo import EnumerationMemo
    X = BindingVar()
    Y = BindingVar()
    Z = BindingVar()
    t1 = Callable.build("f", [X, Y, Y, Z, Z])
    memo = EnumerationMemo()
    t2 = t1.enumerate_vars(memo)
    assert t2.argument_at(0).num == -1
    assert t2.argument_at(1).num == 0
    assert t2.argument_at(2).num == 0
    assert t2.argument_at(3).num == 1
    assert t2.argument_at(4).num == 1
Exemple #7
0
    def __init__(self, head, body, module, next=None):
        from prolog.interpreter import helper
        head = head.dereference(None)
        assert isinstance(head, Callable)
        memo = EnumerationMemo()
        self.head = h = head.enumerate_vars(memo)
        memo.in_head = False
        if h.argument_count() > 0:
            self.headargs = h.arguments()
            # an argument is ground if enumeration left it unchanged, because
            # that means it contains no variables
            self.groundargs = [
                h.argument_at(i) is head.argument_at(i)
                for i in range(h.argument_count())
            ]
        else:
            self.headargs = None
            self.groundargs = None
        if body is not None:
            body = body.dereference(None)
            body = helper.ensure_callable(body)
            self.body = body.enumerate_vars(memo)
        else:
            self.body = None
        memo.assign_numbers()
        self.env_size_body = memo.nbody
        self.env_size_head = memo.nhead
        self.env_size_shared = memo.nshared
        self.signature = head.signature()
        self.module = module
        self.next = next
        self.file_name = "<unknown>"
        self.line_range = None
        self.source = None
        self.scores = None
        self.expanded = False

        self._does_contain_cut()
Exemple #8
0
def ruleterm_to_key(ruleterm):
    memo = EnumerationMemo()
    term = ruleterm.enumerate_vars(memo)
    memo.assign_numbers()

    return term_to_key(term)