Пример #1
0
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:
Пример #2
0
 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])
Пример #3
0
    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')])])
Пример #4
0
 def test_fact_list_error(self):
     with self.assertRaises(TypeError):
         Database().define_fact('foo', 2, (1, 2))