import os, sys curr_dir = os.path.dirname(os.path.realpath(__file__)) gdl_path = os.path.abspath(os.path.join(curr_dir, os.pardir)) sys.path.append(gdl_path) from gdl import Lexer, Parser, Database, DatalogError, ParseError DEFINE = 'GDL> ' QUERY = 'GDL? ' prompt = DEFINE database = Database() for filename in sys.argv[1:]: # read in any files from the command line with open(filename, 'r') as file: tokens = Lexer.run_lex(file=file) for tree in Parser.run_parse(tokens): # print(tree) database.define(tree) try: # interactive loop while 1: raw_string = input(prompt).strip() if raw_string == '?': prompt = QUERY continue elif raw_string == '.': prompt = DEFINE continue elif not raw_string:
def test_fact_variable_argument_error(self): children = [make_mock_node('x'), make_mock_node('?y')] arg = make_mock_node('predicate', children) with self.assertRaises(DatalogError): Database().define_fact('foo', 1, [arg])
def setUp(self): self.db = Database() # FACTS self.db.define_fact('foo', 3, [make_mock_node(x) for x in ('a', 'b', 'c')]) self.db.define_fact('foo', 3, [make_mock_node(x) for x in ('x', 'y', 'z')]) self.db.define_fact('foo', 3, [make_mock_node(x) for x in ('x', 'y', 'x')]) self.db.define_fact('foo', 3, [make_mock_node(x) for x in ('a', 'a', 'a')]) self.db.define_fact('bar', 2, [ make_mock_node('1'), make_mock_node('x', [make_mock_node(x) for x in ('2', '3')]) ]) # RULES # Datalog 2.5 # > path(X,Y) :- path(X,Z), link(Z,Y). # > path(X,Y) :- link(X,Y). # > link(3,4). # > link(2,3). # > link(1,2). path = make_mock_node('path', [make_mock_node(x) for x in ('?x', '?z')]) link = make_mock_node('link', [make_mock_node(x) for x in ('?z', '?y')]) self.db.define_rule('path', 2, [make_mock_node(x) for x in ('?x', '?y')], [path, link]) link = make_mock_node('link', [make_mock_node(x) for x in ('?x', '?y')]) self.db.define_rule('path', 2, [make_mock_node(x) for x in ('?x', '?y')], [link]) self.db.define_fact('link', 2, [make_mock_node(x) for x in ('3', '4')]) self.db.define_fact('link', 2, [make_mock_node(x) for x in ('2', '3')]) self.db.define_fact('link', 2, [make_mock_node(x) for x in ('1', '2')]) # NEGATION # > x(1). x(2). x(3). x(4). # > not_path(X, Y) :- x(X), x(Y), not(path(X, Y)). self.db.define_fact('x', 1, [make_mock_node('1')]) self.db.define_fact('x', 1, [make_mock_node('2')]) self.db.define_fact('x', 1, [make_mock_node('3')]) self.db.define_fact('x', 1, [make_mock_node('4')]) xx = make_mock_node('x', [make_mock_node('?x')]) xy = make_mock_node('x', [make_mock_node('?y')]) path = make_mock_node('path', [make_mock_node(x) for x in ('?y', '?x')]) self.db.define_rule('rpath', 2, [make_mock_node(x) for x in ('?x', '?y')], [xx, xy, path]) not_path = make_mock_node('not', [ make_mock_node('path', [make_mock_node(x) for x in ('?x', '?y')]) ]) self.db.define_rule('not-path', 2, [make_mock_node(x) for x in ('?x', '?y')], [xx, xy, not_path]) # CYCLICAL RECURSION # Datalog 2.5 # > s(1). # > s(2). # > t(1). # > p(X) :- q(X), s(X). # > q(X) :- p(X), t(X). # > q(X) :- t(X). self.db.define_fact('s', 1, [make_mock_node('1')]) self.db.define_fact('s', 1, [make_mock_node('2')]) self.db.define_fact('t', 1, [make_mock_node('1')]) p, q, s, t = [ make_mock_node(x, [make_mock_node('?x')]) for x in ('p', 'q', 's', 't') ] self.db.define_rule('p', 1, [make_mock_node('?x')], [q, s]) self.db.define_rule('q', 1, [make_mock_node('?x')], [p, t]) self.db.define_rule('q', 1, [make_mock_node('?x')], [t]) # DISTINCT # (<= (diff ?x ?y) (x ?x) (x ?y) (distinct ?x ?y)) distinct = make_mock_node( 'distinct', [make_mock_node('?x'), make_mock_node('?y')]) xx = make_mock_node('x', [make_mock_node('?x')]) xy = make_mock_node('x', [make_mock_node('?y')]) self.db.define_rule('diff', 2, [make_mock_node(x) for x in ('?x', '?y')], [xx, xy, distinct]) # OR # (<= (valid? ?x ?y) (not-path ?x ?y) (or (distinct ?y 4) (distinct ?x 4))) d1 = make_mock_node( 'distinct', [make_mock_node('?y'), make_mock_node('4')]) d2 = make_mock_node( 'distinct', [make_mock_node('?x'), make_mock_node('4')]) or_ = make_mock_node('or', [d1, d2]) not_path = make_mock_node('not-path', [make_mock_node(x) for x in ('?x', '?y')]) self.db.define_rule('valid?', 2, [make_mock_node(x) for x in ('?x', '?y')], [not_path, or_]) # 0-ARITY RULES cell = make_mock_node('cell', [make_mock_node(x) for x in ['?m', '?n', 'b']]) self.db.define_rule('open', 0, [], [make_mock_node('true', [cell])]) self.db.define_rule('terminal', 0, [], [make_mock_node('not', [make_mock_node('open')])])
def test_fact_list_error(self): with self.assertRaises(TypeError): Database().define_fact('foo', 2, (1, 2))