2.5. Подстановки 29
• все c-переменные в ce, в ходящие в dom subst, заменяются на их значения из subst
(см. последнее предложение определения оператора (/.)).
Естественным образом расширим определение оператора (/.) на случаи применения
подстановки к неравенству, c-связи, списку c-конструкций, паре c-конструкций и к ре-
стрикции:
instance APPLY InEq Subst where
(l:=/=:r) /. subst = (l/.subst) :=/= : (r/.subst)
instance APPLY CBind Subst where
(pvar := cexpr) /. subst = pvar := (ce xp r/. su bs t)
instance APPLY a subst => APPLY [a] subst where
cxs /. subst = map (/.subst) cxs
instance (APPL Y a subst, APPLY b subst) => APPLY (a,b) subst where
(ax,bx) /. subst = ( (ax/.subst) , (bx/.subst) )
instance APPLY Restr Subst where
INCONSISTENT /. subs t= INCONSISTENT
(RESTR ineqs) /. subst= cleanRestr(RESTR(ineqs/.subst))
Итак, во всех случаях применение подстанов ки subst к c-конструкциям сводится к
поиску в c-конструкциях тех c-переменных, которые входят в dom subst, и замене их
на их значение из подста нов ки. При этом конструкторы, атомы, а также c-переменные,
не входя щие в dom subst, остаются неизмененными. После применения подстановки к
рестрикции, результат упрощается при помощи функции cleanRestr.
Пример 2
Рассмотрим применения подстановок к рестрикции. Пусть:
ineqs = [ A.2:=:/ A.1 , A.2:=:/ ’C, A.3:=:/ ’A]
rs = RESTR ineqs
subst
1
= [ A.1:->’A, A.2:->A.3 ]
subst
2
= [ A.1:->’B, A.3:->’B ]
subst
3
= [ A.2:->A.1, A.3:->’A ]
Тогда, будем иметь следующие результаты применения подста нов ок:
inqs /. subst
1
= [A.3:=:/ ’A, A.3:=:/ ’C, A.3:=:/ ’A]
rs /. subst
1
= RESTR [A.3:=:/ ’A, A.3:=:/ ’C]
inqs /. subst
2
= [A.2:=:/ ’B, A.2:=:/ ’C, ’B:=:/ ’A]
rs /. subst
2
= RESTR [A.2:=:/ ’B, A.2:=:/ ’C]
inqs /. subst
3
= [A.1:=:/ A.1, A.1:=:/ ’C, ’A:=:/ ’A]
rs /. subst
3
= INCONSISTENT