def generate_transitive_assumptions(self):
        trans_assumpts = list()
        for symbol in self.symbol_assumptions:
            assumpt_dict = self.symbol_assumptions[symbol]
            if '>' in assumpt_dict:
                for assump1 in assumpt_dict['>']:
                    if '<' in assumpt_dict:
                        for assump2 in assumpt_dict['<']:
                            trans_assumpts.append(assumption(assump1, '<', assump2))
                    if '<=' in assumpt_dict:
                        for assump2 in assumpt_dict['<=']:
                            trans_assumpts.append(assumption(assump1, '<=', assump2))
            if '>=' in assumpt_dict:
                for assump1 in assumpt_dict['>=']:
                    if '<' in assumpt_dict:
                        for assump2 in assumpt_dict['<']:
                            trans_assumpts.append(assumption(assump1, '<=', assump2))
                    if '<=' in assumpt_dict:
                        for assump2 in assumpt_dict['<=']:
                            trans_assumpts.append(assumption(assump1, '<=', assump2))
            if '==' in assumpt_dict:
                for assump1 in assumpt_dict['==']:
                    for assump2 in assumpt_dict['==']:
                        if assump1 != assump2:
                            trans_assumpts.append(assumption(assump1, '==', assump2))

        dedup(trans_assumpts)
        return trans_assumpts
    def try_assumptions(self, pot, decompose_variant):
        self.assumptions += decompose_variant.assumptions
        self.assumptions = dedup(self.assumptions)

        symbol_intervals = deepcopy( pot.symbol_intervals )

        for assumption in self.assumptions:
            assumption_deps = assumption.depends()
            deps_len = len(assumption_deps)
            if deps_len == 0:
                if assumption.test() == result.not_possible: return False
                continue

            if deps_len == 1:
                symbol = assumption_deps[0]
                if symbol not in symbol_intervals:
                    symbol_intervals[symbol] = intervals()
                lim = decompose(assumption)
                if not lim:
                    print("[warn] decompose failed:", assumption)
                    return False

                res = symbol_intervals[symbol]
                res *= lim
                if res.is_zero(): return False
                symbol_intervals[symbol] = res
                continue

        for symbol_assumption in decompose_variant.symbol_assumptions:
            self._add_symbol_assumption(symbol_assumption)

        self._update_symbol_assumptions()
        if not self._test_symbol_assumptions(): return False
        return self.test_by_symbol_intervals(symbol_intervals)