def main(): x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') a = logic.Var('a') nil = logic.Atom('nil') more = logic.Var('more') zero = logic.Atom('0') length_nil = logic.Clause(logic.Relation('length', (nil, zero))) length_one = logic.Clause( logic.Relation('length', (logic.Relation('pair', (x, more)), logic.Relation('+1', [a]))), [logic.Relation('length', (more, a))]) db = {} logic.store(db, length_nil) logic.store(db, length_one) print 'Database:' print db print list = logic.Relation( 'pair', (x, logic.Relation('pair', (y, logic.Relation('pair', (z, nil)))))) query = logic.Relation('length', (list, a)) print 'Query:', query print logic.prolog_prove([query], db)
def test_prove_primitive_call(self): joe = logic.Atom('joe') judy = logic.Atom('judy') jorge = logic.Atom('jorge') x = logic.Var('x') db = {'likes': [], 'hates': []} db['likes'].append( logic.Clause(logic.Relation('likes', (joe, x)), [ logic.Relation('likes', (x, joe)), logic.Relation('hates', (judy, x)) ])) db['likes'].append(logic.Clause(logic.Relation('likes', (jorge, joe)))) db['hates'].append(logic.Clause(logic.Relation('hates', (judy, jorge)))) things = [] def prim(a, b, c, d): things.append(a) db['prim'] = prim goal = logic.Relation('likes', (joe, x)) display = logic.Relation('prim', 'foo') bindings = logic.prove_all([goal, display], {}, db) self.assertEqual(['foo'], things)
def main(): x = logic.Var('x') y = logic.Var('y') a = logic.Var('a') more = logic.Var('more') member_first = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (x, more))))) member_last = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (y, x))))) member_rest = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (y, more)))), [logic.Relation('member', (x, more))]) db = {} logic.store(db, member_first) logic.store(db, member_last) logic.store(db, member_rest) print 'Database:' print db print query = logic.Relation('member', (logic.Atom('foo'), x)) print 'Query:', query print logic.prolog_prove([query], db)
def defn(self): self.match(DEFN_BEGIN) head = self.relation() tt, tok = self.la(1) if tt == WHEN: self.match(WHEN) return logic.Clause(head, self.relation_list()) return logic.Clause(head)
def test_clauses_different_heads(self): joe = logic.Atom('joe') judy = logic.Atom('judy') jorge = logic.Atom('jorge') x = logic.Var('x') r = logic.Relation('likes', (joe, x)) s = logic.Relation('likes', (joe, judy)) t = logic.Relation('hates', (x, jorge)) c = logic.Clause(r, [s]) d = logic.Clause(t, [s]) self.assertFalse(logic.unify(c, d, {}))
def test_clauses_ok(self): joe = logic.Atom('joe') judy = logic.Atom('judy') jorge = logic.Atom('jorge') x = logic.Var('x') y = logic.Var('y') r = logic.Relation('likes', (joe, x)) s = logic.Relation('hates', (joe, judy)) t = logic.Relation('likes', (y, jorge)) u = logic.Relation('hates', (judy, joe)) v = logic.Relation('hates', (judy, y)) c = logic.Clause(r, [s, v]) d = logic.Clause(t, [s, u]) self.assertEqual({x: jorge, y: joe}, logic.unify(c, d, {}))
def test_clauses_different_bodies(self): joe = logic.Atom('joe') judy = logic.Atom('judy') jorge = logic.Atom('jorge') x = logic.Var('x') y = logic.Var('y') r = logic.Relation('likes', (joe, x)) s = logic.Relation('hates', (joe, judy)) t = logic.Relation('likes', (y, jorge)) u = logic.Relation('hates', (judy, joe)) v = logic.Relation('hates', (judy, x)) c = logic.Clause(r, [s, v]) d = logic.Clause(t, [s, u]) self.assertFalse(logic.unify(c, d, {}))
def test_prove_subgoals_required_fail(self): joe = logic.Atom('joe') judy = logic.Atom('judy') jorge = logic.Atom('jorge') x = logic.Var('x') db = {'likes': [], 'hates': []} db['likes'].append( logic.Clause(logic.Relation('likes', (joe, x)), [ logic.Relation('likes', (x, joe)), logic.Relation('hates', (judy, x)) ])) db['likes'].append(logic.Clause(logic.Relation('likes', (jorge, joe)))) db['hates'].append(logic.Clause(logic.Relation('hates', (judy, joe)))) goal = logic.Relation('likes', (joe, jorge)) bindings = logic.prove(goal, {}, db) self.assertFalse(bindings)
def test_bind_vars(self): a = logic.Atom('a') b = logic.Atom('b') c = logic.Atom('c') x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') r = logic.Relation('likes', (x, y, a)) s = logic.Relation('likes', (y, a, z)) t = logic.Relation('hates', (z, b, x)) bindings = {z: c, y: b, x: y} cl1 = logic.Clause(r, (s, t)) cl2 = logic.Clause( logic.Relation('likes', (b, b, a)), (logic.Relation('likes', (b, a, c)), logic.Relation('hates', (c, b, b)))) self.assertEqual(cl2, cl1.bind_vars(bindings))
def test_prove_all_no_subgoals_required(self): joe = logic.Atom('joe') judy = logic.Atom('judy') jorge = logic.Atom('jorge') x = logic.Var('x') db = {'likes': [], 'hates': []} db['likes'].append( logic.Clause(logic.Relation('likes', (joe, x)), [ logic.Relation('likes', (x, joe)), logic.Relation('hates', (judy, x)) ])) db['likes'].append(logic.Clause(logic.Relation('likes', (jorge, joe)))) db['hates'].append(logic.Clause(logic.Relation('hates', (judy, jorge)))) goal1 = logic.Relation('likes', (x, joe)) goal2 = logic.Relation('hates', (judy, x)) bindings = logic.prove_all([goal1, goal2], {}, db) self.assertEqual({x: jorge}, bindings)
def test_get_vars(self): a = logic.Atom('a') b = logic.Atom('b') x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') r = logic.Relation('likes', (a, x)) s = logic.Relation('likes', (y, b)) t = logic.Relation('hates', (x, z)) c = logic.Clause(r, (s, t)) self.assertEqual(set([x, y, z]), set(c.get_vars()))
def test_rename_vars(self): x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') p = logic.Relation('pair', (y, logic.Relation('pair', (x, z)))) is_member = logic.Relation('member', (x, p)) is_list = logic.Relation('is_list', [p]) rule = logic.Clause(is_member, (is_list, p)) vs = rule.get_vars() begin = logic.Var.counter renames = {v: logic.Var.get_unused_var() for v in vs} rule2 = rule.rename_vars(renames) newx = renames[x] newy = renames[y] newz = renames[z] new_list = logic.Relation('pair', (newy, logic.Relation('pair', (newx, newz)))) rule3 = logic.Clause(logic.Relation('member', (newx, new_list)), (logic.Relation('is_list', [new_list]), new_list)) self.assertEqual(rule3, rule2)
def main(): x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') a = logic.Var('a') nil = logic.Atom('nil') more = logic.Var('more') zero = logic.Atom('0') length_nil = logic.Clause(logic.Relation('length', (nil, zero))) length_one = logic.Clause( logic.Relation('length', (logic.Relation('pair', (x, more)), logic.Relation('+1', [a]))), [logic.Relation('length', (more, a))]) member_first = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (x, more))))) member_last = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (y, x))))) member_end = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (x, nil))))) member_rest = logic.Clause( logic.Relation('member', (x, logic.Relation('pair', (y, more)))), [logic.Relation('member', (x, more))]) db = {} logic.store(db, length_nil) logic.store(db, length_one) logic.store(db, member_end) logic.store(db, member_first) logic.store(db, member_last) logic.store(db, member_rest) print 'Database:' print db print four = logic.Relation('+1', [ logic.Relation('+1', [logic.Relation('+1', [logic.Relation('+1', [zero])])]) ]) foo = logic.Atom('foo') has_foo = logic.Relation('member', (foo, x)) length_4 = logic.Relation('length', (x, a)) print 'Query:', has_foo, length_4 print logic.prolog_prove([has_foo, length_4], db)
def test_recursive_rename(self): list = logic.Var('list') x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') member = logic.Clause(logic.Relation('member', (x, list)), [ logic.Relation('first', (list, y)), logic.Relation('rest', (list, z)), logic.Relation('member', (x, z)) ]) renamed = member.recursive_rename() bindings = logic.unify(renamed, member, {}) self.assertTrue(x in bindings or x in bindings.values()) self.assertTrue(y in bindings or y in bindings.values()) self.assertTrue(z in bindings or z in bindings.values())
def main(): #logging.basicConfig(level=logging.DEBUG) db = {} kim = logic.Atom('Kim') robin = logic.Atom('Robin') sandy = logic.Atom('Sandy') lee = logic.Atom('Lee') cats = logic.Atom('cats') x = logic.Var('x') sandy_likes = logic.Relation('likes', (sandy, x)) likes_cats = logic.Relation('likes', (x, cats)) sandy_likes_rule = logic.Clause(sandy_likes, [likes_cats]) kim_likes = logic.Relation('likes', (kim, x)) likes_lee = logic.Relation('likes', (x, lee)) likes_kim = logic.Relation('likes', (x, kim)) kim_likes_rule = logic.Clause(kim_likes, [likes_lee, likes_kim]) likes_self = logic.Clause(logic.Relation('likes', (x, x))) klr = logic.Clause(logic.Relation('likes', (kim, robin))) sll = logic.Clause(logic.Relation('likes', (sandy, lee))) slk = logic.Clause(logic.Relation('likes', (sandy, kim))) rlc = logic.Clause(logic.Relation('likes', (robin, cats))) logic.store(db, sandy_likes_rule) logic.store(db, kim_likes_rule) logic.store(db, likes_self) logic.store(db, klr) logic.store(db, sll) logic.store(db, slk) logic.store(db, rlc) print 'Database:' print db print query = logic.Relation('likes', (sandy, logic.Var('who'))) print 'Query:', str(query) print logic.prolog_prove([query], db)
def main(): #logging.basicConfig(level=logging.DEBUG) db = {} kim = logic.Atom('Kim') robin = logic.Atom('Robin') sandy = logic.Atom('Sandy') lee = logic.Atom('Lee') cats = logic.Atom('cats') x = logic.Var('x') y = logic.Var('y') z = logic.Var('z') self_likes = logic.Clause(logic.Relation('likes', (x, x))) transitive_likes = logic.Clause( logic.Relation('likes', (x, y)), (logic.Relation('likes', (x, z)), logic.Relation('likes', (z, y)))) klr = logic.Clause(logic.Relation('likes', (kim, robin))) sll = logic.Clause(logic.Relation('likes', (sandy, lee))) slk = logic.Clause(logic.Relation('likes', (sandy, kim))) rlc = logic.Clause(logic.Relation('likes', (robin, cats))) llr = logic.Clause(logic.Relation('likes', (lee, robin))) logic.store(db, klr) logic.store(db, sll) logic.store(db, slk) logic.store(db, rlc) logic.store(db, llr) logic.store(db, self_likes) logic.store(db, transitive_likes) print 'Database:' print db print query = logic.Relation('likes', (sandy, logic.Var('who'))) print 'Query:', str(query) print logic.prolog_prove([query], db)