def unifier_atom(expr1: Expression, expr2: Expression): if (expr2.isAtom()): expr1, expr2 = expr2, expr1 if (expr1 == expr2): return [] if (expr2.isVariable()): expr1, expr2 = expr2, expr1 if (expr1.isVariable()): if (expr1 in expr2): return None if (expr2.isAtom()): return [[expr1.expression[0], expr2.expression[0]]] else: return [[expr1.expression[0], expr2.expression.__str__()]] return None
def unifier(terms1: Expression, terms2: Expression): if (terms1.isAtom() or terms2.isAtom()): return unifier_atom(terms1, terms2) F1, T1 = terms1.separate() F2, T2 = terms2.separate() Z1 = unifier(F1, F2) if (Z1 == None): return None T1.substitute(Z1) T2.substitute(Z1) Z2 = unifier(T1, T2) if (Z2 == None): return None Z2 += Z1 return Z2