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
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
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
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))))
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
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)