30 lines
767 B
Python
30 lines
767 B
Python
|
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
|