packages feed

lambdabot-4.1: scripts/FT/FreeTheorems/Modification.hs

-- Copyright 2006, Sascha Boehme.




-- | This module defines a function to modify theorems by omitting
--   instantiations in terms.

module FreeTheorems.Modification (
    omitInstantiations,
    omitInstantiationsInUnfoldedRelation
) where



import FreeTheorems.Types



-- | Omits all instantiations in the terms of the given theorem.

omitInstantiations :: Theorem -> Theorem
omitInstantiations theorem =
  case theorem of
    IsElementOf (t1,t2) r   -> IsElementOf (omitIns t1, omitIns t2)
                                           (omitInsRel r)
    ForallPairs p r t       -> ForallPairs p (omitInsRel r)
                                             (omitInstantiations t)
    ForallRelations rv r t  -> ForallRelations rv r (omitInstantiations t)
    ForallFunctions f p r t -> ForallFunctions f p r (omitInstantiations t)
    ForallElements x ty t   -> ForallElements x ty (omitInstantiations t)
    Conjunction t1 t2       -> Conjunction (omitInstantiations t1)
                                           (omitInstantiations t2)
    Implication t1 t2       -> Implication (omitInstantiations t1)
                                           (omitInstantiations t2)



-- | Omits all instantiations in unfolded relations.

omitInstantiationsInUnfoldedRelation :: UnfoldedRelation -> UnfoldedRelation
omitInstantiationsInUnfoldedRelation (UnfoldedRelation rel model set) =
  UnfoldedRelation (omitInsRel rel) model (omitInsSet set)



-- | Omit instantiations in relations.

omitInsRel :: Relation -> Relation
omitInsRel rel =
  case rel of
    RelTerm t types     -> RelTerm (omitIns t) types
    RelVar _            -> rel
    RelLift m c rels    -> RelLift m c (map omitInsRel rels)
    RelLiftList m rel'  -> RelLiftList m (omitInsRel rel')
    RelLiftTuple m rels -> RelLiftTuple m (map omitInsRel rels)
    RelFun m rel1 rel2  -> RelFun m (omitInsRel rel1) (omitInsRel rel2)
    RelForall m rv rel' -> RelForall m rv (omitInsRel rel')



-- | Omits instantiations in unfolded sets.

omitInsSet :: UnfoldedSet -> UnfoldedSet
omitInsSet set =
  case set of
    UnfoldedLift list     -> UnfoldedLift (map omit list)
    UnfoldedLiftList p t  -> UnfoldedLiftList p (omitInstantiations t)
    UnfoldedLiftTuple p t -> UnfoldedLiftTuple p (omitInstantiations t)
    UnfoldedFunction p t  -> UnfoldedFunction p (omitInstantiations t)
    UnfoldedForall p t    -> UnfoldedForall p (omitInstantiations t)
  where
    omit (con, xs, ys, mt) =
      case mt of
        Nothing -> (con, xs, ys, mt)
        Just t  -> (con, xs, ys, Just (omitInstantiations t))



-- | Omits all instantiations in a term.

omitIns :: Term -> Term
omitIns t =
  case t of
    TermVar tv    -> TermVar tv
    TermApp t1 t2 -> TermApp (omitIns t1) (omitIns t2)
    TermIns t _   -> omitIns t