def has_solution(self, *query: Union[Atom, Not]): var_store = {} if len(query) == 1: query = query[0] args = [_to_pygp(x, var_store) for x in query.get_arguments()] func = pygprolog.pygp_Find_Atom(query.get_predicate().get_name()) pygprolog.pygp_Query_Begin() q_Var1 = pygprolog.pygp_Query_Call(func, query.get_predicate().get_arity(), args) pygprolog.pygp_Query_End() return True if q_Var1 == 1 else False else: first_elem = _lit_to_pygp(query[0], var_store) rest = [ _lit_to_pygp(x, var_store) if isinstance(x, Atom) else _neg_to_pygp(x, var_store) for x in query[1:] ] rest = _conjoin_lits(rest) pygprolog.pygp_Query_Begin() conjf = pygprolog.pygp_Find_Atom(",") q_Var = pygprolog.pygp_Query_Call(conjf, 2, [first_elem, rest]) pygprolog.pygp_Query_End() return True if q_Var == 1 else False
def _retract_lit(self, literal: Atom): pl = _lit_to_pygp(literal) asa_p = pygprolog.pygp_Find_Atom("retract") pygprolog.pygp_Query_Begin() q_Var1 = pygprolog.pygp_Query_Call(asa_p, 1, [pl]) pygprolog.pygp_Query_End() return q_Var1
def consult(self, filename): consult = pygprolog.pygp_Find_Atom("consult") arg = pygprolog.pygp_Mk_String(filename) pygprolog.pygp_Query_Begin() q_Var1 = pygprolog.pygp_Query_Call(consult, 1, [arg]) pygprolog.pygp_Query_End() return q_Var1
def query(self, *query, **kwargs): if 'max_solutions' in kwargs: max_solutions = kwargs['max_solutions'] else: max_solutions = -1 vars_of_interest = [[y for y in x.get_arguments() if isinstance(y, Variable)] for x in query] vars_of_interest = reduce(lambda x, y: x + y, vars_of_interest, []) vars_of_interest = reduce(lambda x, y: x + [y] if y not in x else x, vars_of_interest, []) var_store = dict([(x, pygprolog.pygp_Mk_Variable()) for x in vars_of_interest]) pygprolog.pygp_Query_Begin() if len(query) == 1: query = query[0] f = pygprolog.pygp_Find_Atom(query.get_predicate().get_name()) args = [_to_pygp(x, var_store) for x in query.get_arguments()] res = pygprolog.pygp_Query_Call(f, len(args), args) else: first = _lit_to_pygp(query[0], var_store) rest = [ _lit_to_pygp(x, var_store) if isinstance(x, Atom) else _neg_to_pygp(x, var_store) for x in query[1:] ] rest = _conjoin_lits(rest) conjf = pygprolog.pygp_Find_Atom(",") res = pygprolog.pygp_Query_Call(conjf, 2, [first, rest]) # discover all solutions all_solutions = [] while res and max_solutions != 0: tmp_solution = {} for vn in var_store: tmp_solution[vn] = _read_pygp(var_store[vn]) res = pygprolog.pygp_Query_Next_Solution() max_solutions -= 1 all_solutions.append(tmp_solution) pygprolog.pygp_Query_End() return all_solutions
def _retract_cl(self, clause: Clause): clp = _cl_to_pygp(clause) asa_p = pygprolog.pygp_Find_Atom("retract") pygprolog.pygp_Query_Begin() q_Var1 = pygprolog.pygp_Query_Call(asa_p, 1, [clp]) pygprolog.pygp_Query_End() return q_Var1