def _neg_to_pygp(negation: Not, var_store=None): if var_store is None: var_store = {} inner = _lit_to_pygp(negation.get_atom(), var_store) ng_f = pygprolog.pygp_Find_Atom("\\+") return pygprolog.pygp_Mk_Compound(ng_f, 1, [inner])
def _lit_to_pygp(literal: Atom, var_store=None): if var_store is None: var_store = {} pred = pygprolog.pygp_Find_Atom(literal.get_predicate().get_name()) if pred < 0: pred = pygprolog.pygp_Create_Allocate_Atom(literal.get_predicate().get_name()) args = [_to_pygp(x, var_store) for x in literal.get_arguments()] return pygprolog.pygp_Mk_Compound(pred, literal.get_predicate().get_arity(), args)
def _pair_to_pygp(p: Pair, lit_var_store: Dict[Variable, int]): left = _to_pygp(p.get_left(), lit_var_store) right = _to_pygp(p.get_right(), lit_var_store) functor = pygprolog.pygp_Find_Atom('.') if functor < 0: functor = pygprolog.pygp_Create_Allocate_Atom('.') args = [left, right] return pygprolog.pygp_Mk_Compound(functor, 2, args)
def _cl_to_pygp(clause: Clause): var_store = {} head_pygp = _lit_to_pygp(clause.get_head(), var_store) body_pygp = [ _lit_to_pygp(x, var_store) if isinstance(x, Atom) else _neg_to_pygp(x, var_store) for x in clause.get_body().get_literals() ] # conj_f = pygprolog.pygp_Find_Atom(",") # body_pygp = reduce(lambda x, y: pygprolog.pygp_Mk_Compound(conj_f, 2, [x, y]), body_pygp) body_pygp = _conjoin_lits(body_pygp) cl_f = pygprolog.pygp_Find_Atom(":-") return pygprolog.pygp_Mk_Compound(cl_f, 2, [head_pygp, body_pygp])
def _conjoin_lits(pyg_literals): conj_f = pygprolog.pygp_Find_Atom(",") return reduce(lambda x, y: pygprolog.pygp_Mk_Compound(conj_f, 2, [x, y]), pyg_literals)
def _structure_to_pygp(struct: Structure, lit_var_store: Dict[Variable, int]): func = _functor_to_pygp(struct.get_functor()) args = [_to_pygp(x, lit_var_store) for x in struct.get_arguments()] return pygprolog.pygp_Mk_Compound(func, struct.get_functor().get_arity(), args)