'Extends the isomorphism mapping.
This function is called recursively to determine if a complete
isomorphism can be found between G1 and G2.  It cleans up the class
variables after each recursive call. If an isomorphism is found,
we yield the mapping.'

def match(self):

    if (len(self.core_1) == len(self.G2)):
        self.mapping = self.core_1.copy()
        (yield self.mapping)
    else:
        for (G1_node, G2_node) in self.candidate_pairs_iter():
            if self.syntactic_feasibility(G1_node, G2_node):
                if self.semantic_feasibility(G1_node, G2_node):
                    newstate = self.state.__class__(self, G1_node, G2_node)
                    for mapping in self.match():
                        (yield mapping)
                    newstate.restore()
