Example #1
0
 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
Example #2
0
 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)
Example #3
0
 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)