Ejemplo n.º 1
0
def test_int_not_parsed():
    "Ensures that .int_not_parsed modifier behave correctly"
    asp = 'a(1). #show a/1.'
    for model in next(clyngor.ASP(asp)):
        t = type(model[1][0])
        assert t is int, t
    for model in next(clyngor.ASP(asp).int_not_parsed):
        t = type(model[1][0])
        assert t is str, t
Ejemplo n.º 2
0
def test_string_with_lot_of_crap():
    dangerous_string = r'"\"1,3-dimethyl-2-[2-oxopropyl thio]imidazolium chloride\""'
    for sol in clyngor.ASP('atom({}).'.format(dangerous_string)).careful_parsing:
        assert len(sol) == 1
        pred, args = next(iter(sol))
        assert pred == 'atom'
        assert len(args) == 1
        assert args[0] == dangerous_string
Ejemplo n.º 3
0
def test_string_without_escaped_quotes():
    dangerous_string = r'1,3-dimethyl-2-[2-oxopropyl thio]imidazolium chloride'
    quoted_dangerous_string = f'"{dangerous_string}"'
    for sol in clyngor.ASP('atom({}).'.format(quoted_dangerous_string)).careful_parsing:
        assert len(sol) == 1
        pred, args = next(iter(sol))
        assert pred == 'atom'
        assert len(args) == 1
        assert args[0] == quoted_dangerous_string
Ejemplo n.º 4
0
def test_lispy_construct():
    dangerous_string = r'"1,3-dimethyl-2-[2-oxopropyl thio]imidazolium chloride"'
    source = r'atom((((a,b),c),d),{},(1,(2,3))). yield(X,Y,Z):- atom(X,Y,Z).'.format(dangerous_string)
    for sol in clyngor.ASP(source).careful_parsing.by_predicate.parse_args:
        assert len(sol) == 2
        assert sol['atom'] == sol['yield']
        args = next(iter(sol['yield']))
        assert len(args) == 3
        assert args[0] == ('', (('', (('', ('a', 'b')), 'c')), 'd'))
        assert args[1] == dangerous_string
        assert args[2] == ('', (1, ('', (2, 3))))
Ejemplo n.º 5
0
def generate(debug=False):
    program = domains_program()

    if debug:
        print(program)

    # TODO use solve api
    answers = clyngor.ASP(program).careful_parsing

    # manual decoding because of API deficiencies
    things = {
        python_ident_to_atom(p._name): p
        for p in world().defined_names.values()
    }

    results = []
    for answer in answers:
        for name, args in answer:
            if name in things:
                results.append(things[name](*args))
        break

    return results
Ejemplo n.º 6
0
def solve(program=None, file=None):
    if not program and not file:
        # lol no sum types
        raise Exception('provide a program or file')

    if file:
        with open(file, 'r') as f:
            program = f.read()

    mappings = {}
    for m in re.finditer(r'%% (\w+)\(([^)]+)\)', program):
        name = m.group(1)
        args = re.split(r', ?', m.group(2))
        mappings[name] = args

    # TODO handle unsat
    # TODO random
    # TODO number of answers

    answers = clyngor.ASP(program).careful_parsing
    # assumes that there's no overloading by arity

    for answer in answers:  # nondeterminism
        yield process_df(answer, mappings)