def unify(lhs, rhs): res = {} try: unify_res(lhs, rhs, res) except Exception: return None return res def unify_res(lhs, rhs, result): if lhs.name == 'VAR': unify_var(lhs, rhs, result) elif rhs.name == 'VAR': unify_var(rhs, lhs, result) else: left = lhs.children right = rhs.children if len(left) == len(right): for i in range(len(left)): unify_res(left[i], right[i], result) def unify_var(var, rhs, result): if rhs.name in ['VAR', 'CONST', 'FUN'] and rhs.value != var.value: if var.value in result.keys() \ and not result[var.value].equals(rhs): raise Exception('') else: result[var.value] = rhs