Given a list/set of keys (or one key), returns the parts that have
        all of the keys in the list.

        Because on_targets=True, this DOES NOT WORK WITH TOP LEVEL PROPERTIES,
        only those of targets.

        These paths are not pointers to the objects themselves, but tuples of
        attribute names that allow us to (attempt) to look up that object in any
        belief state.

def get_paths_for_attribute_set(self, keys):
        """
        Given a list/set of keys (or one key), returns the parts that have
        all of the keys in the list.

        Because on_targets=True, this DOES NOT WORK WITH TOP LEVEL PROPERTIES,
        only those of targets.

        These paths are not pointers to the objects themselves, but tuples of
        attribute names that allow us to (attempt) to look up that object in any
        belief state.
        """
        if not isinstance(keys, (list, set)):
            keys = [keys]

        has_all_keys = lambda name, structure: \
                all(map(lambda k: k in structure, keys))
        return self.find_path(has_all_keys, on_targets=True)