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
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
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
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()
def ruleterm_to_key(ruleterm): memo = EnumerationMemo() term = ruleterm.enumerate_vars(memo) memo.assign_numbers() return term_to_key(term)