Я пытаюсь представить формулы с переменными, например, между формулами или переменными и константами:
R(a,b) -> Q [Q takes formulae as substitutions]
R(x,b) v P(b) [x takes constants or variables as substitutions]
Функции над формулами имеют ограничения класса, указывающие, какой тип переменной рассматривается.Например, классы терминов, переменных и подстановок могут иметь следующую структуру:
class Var b where ...
class (Var b) => Term b a | b -> a where ...
class (Term b a) => Subst s b a | b a -> s where ...
Существует много алгоритмов, имеющих дело с синтаксической манипуляцией терминами, для которых параметризация типов терминов в типах переменных была бы полезной.Например, рассмотрим универсальный алгоритм объединения по формулам некоторых типов терминов, имеющих разные типы переменных:
unify :: (Subst s b a) => a -> a -> s b a
unify (P -> F(a,b)) ((Q v R) -> F(a,b)) = {P\(Q v R)} -- formulae
unify (P(x,f(a,b))) (P(g(c),f(y,b))) = {x\g(c),y\a} -- variables and constants
Каков способ представления таких переменных best ?Я экспериментировал с различными методами, но не остановился на удовлетворительном решении.