def match(self, subject: Union[Expression, FlatTerm]) -> Iterator[Tuple[T, Substitution]]:
        """Match the given subject against all patterns in the net.

        Args:
            subject:
                The subject that is matched. Must be constant.

        Yields:
            A tuple :code:`(final label, substitution)`, where the first component is the final label associated with
            the pattern as given when using :meth:`add()` and the second one is the match substitution.
        """
        for index in self._match(subject):
            pattern, label = self._patterns[index]
            subst = Substitution()
            if subst.extract_substitution(subject, pattern.expression):
                for constraint in pattern.constraints:
                    if not constraint(subst):
                        break
                else:
                    yield label, subst
Match the given subject against all patterns in the net.

        Args:
            subject:
                The subject that is matched. Must be constant.

        Yields:
            A tuple :code:`(final label, substitution)`, where the first component is the final label associated with
            the pattern as given when using :meth:`add()` and the second one is the match substitution.