packages feed

liquid-fixpoint-0.8.0.2: src/Language/Fixpoint/Types/Templates.hs

module Language.Fixpoint.Types.Templates (

  anything, Templates, makeTemplates, 

  isEmptyTemplates, isAnyTemplates,

  matchesTemplates, filterUnMatched

  )where

import Language.Fixpoint.Types.Refinements
import Language.Fixpoint.Types.Names
import Language.Fixpoint.Types.PrettyPrint
import Text.PrettyPrint.HughesPJ.Compat

data Templates 
  = TAll 
  | TExprs [Template] 
  deriving Show


type Template = ([Symbol], Expr)


class HasTemplates a where 
  filterUnMatched :: Templates -> a -> a 


instance HasTemplates Expr where
  filterUnMatched temps e = pAnd $ filter (not . matchesTemplates temps) $ conjuncts e 

instance HasTemplates Reft where
  filterUnMatched temps (Reft (x,e)) = Reft (x, filterUnMatched temps e)

matchesTemplates :: Templates -> Expr -> Bool 
matchesTemplates TAll _ = True 
matchesTemplates (TExprs ts) e = any (`matchesTemplate` e) ts

matchesTemplate :: Template -> Expr -> Bool 
matchesTemplate (xs, t@(EVar x)) e
  = x `elem` xs || e == t  
matchesTemplate (xs, EApp t1 t2) (EApp e1 e2) 
  = matchesTemplate (xs, t1) e1 && matchesTemplate (xs, t2) e2 
matchesTemplate (xs, ENeg t) (ENeg e) 
  = matchesTemplate (xs, t) e
matchesTemplate (xs, EBin b t1 t2) (EBin b' e1 e2) 
  = b == b' && matchesTemplate (xs, t1) e1 && matchesTemplate (xs, t2) e2 
matchesTemplate (xs, EIte t1 t2 t3) (EIte e1 e2 e3) 
  = matchesTemplate (xs, t1) e1 && matchesTemplate (xs, t2) e2 && matchesTemplate (xs, t3) e3 
matchesTemplate (xs, ECst t s) (ECst e s') 
  = s == s' && matchesTemplate (xs, t) e
matchesTemplate (xs, ELam b t) (ELam b' e) 
  = b == b' && matchesTemplate (xs, t) e
matchesTemplate (xs, ETApp t s) (ETApp e s') 
  = s == s' && matchesTemplate (xs, t) e
matchesTemplate (xs, ETAbs t s) (ETAbs e s') 
  = s == s' && matchesTemplate (xs, t) e
matchesTemplate (xs, PNot t) (PNot e) 
  = matchesTemplate (xs, t) e
matchesTemplate (xs, PAnd ts) (PAnd es) 
  = and $ zipWith (\t e -> matchesTemplate (xs, t) e) ts es 
matchesTemplate (xs, POr ts) (POr es) 
  = and $ zipWith (\t e -> matchesTemplate (xs, t) e) ts es 
matchesTemplate (xs, PImp t1 t2) (PImp e1 e2) 
  = matchesTemplate (xs, t1) e1 && matchesTemplate (xs, t2) e2 
matchesTemplate (xs, PIff t1 t2) (PIff e1 e2) 
  = matchesTemplate (xs, t1) e1 && matchesTemplate (xs, t2) e2 
matchesTemplate (xs, PAtom b t1 t2) (PAtom b' e1 e2) 
  = b == b' && matchesTemplate (xs, t1) e1 && matchesTemplate (xs, t2) e2 
matchesTemplate (xs, PAll s t) (PAll s' e) 
  = s == s' && matchesTemplate (xs, t) e
matchesTemplate (xs, PExist s t) (PExist s' e) 
  = s == s' && matchesTemplate (xs, t) e
matchesTemplate (xs, PGrad s1 s2 s3 t) (PGrad s1' s2' s3' e) 
  = s1 == s1' && s2 == s2' && s3 == s3' && matchesTemplate (xs, t) e
matchesTemplate (xs, ECoerc s1 s2 t) (ECoerc s1' s2' e) 
  = s1 == s1' && s2 == s2' && matchesTemplate (xs, t) e
matchesTemplate (_, t) e 
  = t == e 



makeTemplates :: [([Symbol], Expr)] -> Templates
makeTemplates = TExprs 


isEmptyTemplates, isAnyTemplates :: Templates -> Bool 
isEmptyTemplates (TExprs []) = True 
isEmptyTemplates _           = False 

isAnyTemplates TAll = True 
isAnyTemplates _    = False 

anything :: Templates
anything = TAll

instance Semigroup Templates where 
  TAll <> _ = TAll
  _ <> TAll = TAll
  TExprs i1 <> TExprs i2 = TExprs (i1 ++ i2)

instance Monoid Templates where 
  mempty = TExprs [] 

instance PPrint Templates where
  pprintTidy _ = text . show