def make_safe(self, q: ConjunctiveQuery): """ Adds atoms to make safe the rule :param q: A ConjunctiveQuery """ i = 0 atoms = list(self.atoms) for var in self.head.all_variables(): k = 0 while k < len(atoms) and (not isinstance(atoms[k], Atom) or self.neg[atoms[k]] or var not in atoms[k].content): k += 1 if k == len(atoms): for atom in q.get_atoms(): content = atom.content if var in content: new_vars = generate_new_variables( "F", len(content) - 1, i) new_content = [] j = 0 for value in content: if value != var: new_content.append(new_vars[j]) j += 1 else: new_content.append(var) new_atom = Atom(atom.name, new_content) new_atom.released = set(new_content).intersection( self.head.content) self.add_atom(new_atom) break i += 1
def __init__(self, data: RewritingData): head = Atom("BadBlock_" + str(data.index), data.frozen + data.vars_x) head.released = set(data.frozen + data.vars_x) FORewritingQuery.__init__(self, head, data.done) z_atom = Atom(data.atom.name, data.x + data.vars_z) z_atom.released = set(data.frozen + data.vars_x).intersection( set(z_atom.content)) self.add_atom(z_atom) if data.has_c: self.add_atom( Atom("GoodFact_" + str(data.index), data.frozen + data.vars_x + data.vars_z), True) else: self.add_atom( Atom("RewriteAtom_" + str(data.index + 1), data.new_frozen), True) self.make_safe(data.q)
def __init__(self, data: RewritingData): head = Atom("GoodFact_" + str(data.index), data.frozen + data.vars_x + data.vars_z) head.released = set(data.frozen + data.vars_x + data.vars_z) FORewritingQuery.__init__(self, head, data.done) z_atom = Atom(data.atom.name, data.x + data.vars_z) z_atom.released = set(data.frozen + data.vars_x + data.vars_z).intersection(set(z_atom.content)) self.add_atom(z_atom) for val in data.c: ea = EqualityAtom(val, data.c[val]) ea.released = set(data.frozen + data.vars_x + data.vars_z).intersection({val, data.c[val]}) self.add_atom(ea) if not data.is_last: self.add_atom( Atom("RewriteAtom_" + str(data.index + 1), data.new_frozen)) self.make_safe(data.q)