У меня есть список environment, в котором сохраняются связи между переменными и значениями, например env = [("x", 1), ("y", 2), ("z", 3), ...]
. У меня также есть еще один список подстановок (который возвращается функцией управления сопоставлением с образцом), в котором сохраняются связи между переменными и образцом, например s = [("v", Var_p "z"), ("w", Var_p "v"), ("u", Var_p "w"), ...]
. Рассмотрим первую пару ("v", Var_p "z")
: моя функция должна проверить значение, соответствующее z
, в среде, создать новую связь между значениями v
и z
(то есть ("v", 3)
) и поместить ее в среду. Мой код для этой функции следующий.
fun augment_env ([], e : env) = e
| augment_env (s :: srest, e : env) =
let
val (a, b) = s
in
case b of
Const_p i => [] @ augment_env_with_vars (srest, e)
| Var_p x =>
if (exists (e, x)) then (a, lookup (e, x)) :: augment_env_with_vars (srest, e)
end;
Здесь s
— список подстановок, а exists
и lookup
— функции, которые проверяют наличие переменной в среде и ищут соответствующее значение соответственно. Проблема с этой функцией в том, что она отлично работает только для прямых ассоциаций (в примере она помещает в среду прямую ассоциацию между v
и 3
). Очевидно, что это не работает для транзитивных ассоциаций, если я не вызываю их несколько раз (которых я заранее не знаю, сколько их). Чтобы вспомнить пример, к концу этой функции мой список окружения должен быть env = [("x", 1), ("y", 2), ("z", 3), ("v", 3), ("w", 3), ("u", 3), ...]
.
Не могли бы вы дать мне подсказку о том, как изменить эту функцию, чтобы она нормально работала и с транзитивными ассоциациями?
Заранее спасибо!