2.3. Рестрикции C-переменных 25
Ниже описаны функции isContradiction и isTautology, проверяющие, является
ли неравенство противоречием или тавтологией:
isContradiction, isTautology :: InEq -> Bool
isContradiction (left :=/=: right) = (left == right)
isTautology (ATOM a :=/=: ATOM b) = (a /= b)
isTautology (left :=/=: right) = False
Для неравенств о перат ор (/=) определим так, чтобы учитывалось, что неравенство
по своему смыслу яв ляется неупорядоченной парой:
instance Eq InEq where
(l1:=/=:r1) == (l2:=/=:r2) | (l1==l2) && (r1==r2) = True
| (l1==r2) && (r1==l2) = True
| otherwise = False
Так как рестрикция—система неравенств, то следующие преобразования являются
эквивалентными преобразованиями, упрощающими рестрикцию: приведение рестрик-
ции к виду INCONSISTENT, если в рестрикции имеется хоть одно противоречие; удаление
повторных неравенств
2
; удаление тавтологий. Ниже определена функция cleanR es tr,
выполняющая данные упрощения рестрикции:
cleanRestr :: Restr -> Restr
cleanRestr INCONSISTENT = INCONSISTENT
cleanRestr (RESTR in eq s) = INCONSISTENT, if any isC on tra di ct io n ineqs
cleanRestr (RESTR in eq s) = RESTR (nub(filter ( no t. is Ta uto lo gy ) ineqs))
Утверждение 1
Пусть rs—рестрикция. Тогда cleanRestr rs—рестрикция.
Доказательство
Следует из определения функции cleanR es tr и из определения 7.
Ниже приводится описание оператора (+.), объединяющего две рестрикции. При
этом рестрикции рассматриваются как системы неравенств—если хотя бы одна рестрик-
ция несовместна, то и вместе они несо вместны. В противном случае системы объединя-
ются, после чего убираются повторные неравенства при помощи функции cleanRestr:
instance UPDATE Restr where
INCONSISTENT +. _ = INCONSIST ENT
_ +. INCONSISTENT = INCONSIST ENT
(RESTR r1) +. (RESTR r2) = cleanRestr (RE ST R( r1 ++ r2 ))
2
Для этого будет использована стандартная функция nub, удаляющая повторные элементы из
списка. В силу определения оператора (==) для неравенств, функция nub будет сравнивать неравенства
как неупорядоченные пары.