'Return a set of all the variables for binding substitution.
The variables returned include all free (non-bound) individual
variables and any variable starting with \'?\' or \'@\'.
:return: set of ``Variable`` objects'

def variables(self):

    return (self.free() | set((p for p in (self.predicates() | self.constants()) if re.match(u'^[?@]', p.name))))
