sine-patre/fol/unify.py

30 lines
767 B
Python
Raw Normal View History

2024-04-25 16:47:45 +00:00
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