funcons-intgen-0.2.0.3: src/Types/SourceAbstractSyntax.hs
module Types.SourceAbstractSyntax (
-- defined here
CBSFile(..), CBSSpec(..), TypeSynonymSpec(..), DataTypeSpec(..),
EntitySpec(..), FunconSpec(..), FRule(..), FSideCondition(..),
FSig(..), FParam(..), ParamPattern(..), Name, FStep(..), FPremiseStep(..),
FPattern(..), FLiteral(..), ADTConstructor,
FSort, TypeEnv, TyAssoc(..), AliasMap, my_aliases,
MetaVar, FTerm(..), DataTypeAlt(..),
CommentPart(..), isStrictParam, isStrictSort, termArgs, isVariadic,
-- defined in Funcons.EDSL
SeqSortOp(..),
) where
import Funcons.EDSL (SeqSortOp(..))
import Types.ConcreteSyntax (MetaSpec(..), Term, Premise)
import qualified Data.Map as M
type Name = String
data CBSFile = CBSFile {cbs :: [CBSSpec], env :: TypeEnv, aliases :: AliasMap }
type TypeEnv = M.Map MetaVar TyAssoc
data TyAssoc = ElemOf FSort | SubTyOf FSort
type AliasMap = M.Map Name [Name]
my_aliases :: Name -> AliasMap -> [Name]
my_aliases nm als = my_aliases' [] nm als
where my_aliases' ctx nm als
| nm `elem` ctx = error "cyclic aliases"
| otherwise = nm : concatMap (\n -> my_aliases' (nm:ctx) n als)
(maybe [] id (M.lookup nm als))
data CBSSpec = FunconSpec FunconSpec
| TypeSynonymSpec TypeSynonymSpec
| DataTypeSpec DataTypeSpec
| TypeSpec DataTypeSpec
| EntitySpec EntitySpec
| MetaSpec MetaSpec
deriving (Show)
data TypeSynonymSpec = TypeSynonymDecl Name [FParam] FSort
deriving (Show)
data DataTypeSpec = DataTypeDecl Name [FParam] [DataTypeAlt]
deriving (Show)
data DataTypeAlt = DataTypeInclusion FSort
| DataTypeConstructor Name [FSort]
deriving (Eq,Ord,Show)
data EntitySpec = InheritedSpec (Name,FTerm,FSort)
| MutableSpec (Name,FTerm,FSort) (Name,FPattern,FSort)
| InputSpec (Name,FPattern,FSort)
| OutputSpec (Name,FPattern,FSort)
| ControlSpec (Name,FSort)
deriving (Show)
data FunconSpec = FAbbrv FSig (Maybe FTerm) {- nothing if := ... -}
| FRules FSig [FRule]
deriving (Show)
data FRule = FRuleRewrite Name (Maybe [FPattern]) (Maybe FTerm) [FSideCondition]
| FRuleStep Name FStep [Either FPremiseStep FSideCondition]
deriving (Eq,Ord,Show)
data FSideCondition = SCEquality FTerm FTerm
| SCInequality FTerm FTerm
| SCPatternMatch FTerm [FPattern]
| SCIsInSort FTerm FSort
deriving (Eq,Ord,Show)
data FSig = FSig
{ sigName :: Name,
sigParams :: [FParam],
sigSort :: FSort,
sigDoc :: Maybe [CommentPart]
}
deriving (Show)
data CommentPart = Ordinary String
| Asterisk
| At String
| CommentTerm [Term]
| CommentPremise Premise
| SpecInComment CBSSpec
deriving Show
type FParam = (ParamPattern, Maybe FSort)
isStrictParam :: FParam -> Bool
isStrictParam param@(_,sorts) = maybe False isStrictSort sorts
isStrictSort :: FSort -> Bool
isStrictSort sort = case sort of
TSortSeq (TTuple [t]) _ -> isStrictSort t
TSortSeq t _ -> isStrictSort t
TSortComputes _ -> False
TSortComputesFrom _ _ -> False
_ -> True
isVariadic :: FParam -> Bool
isVariadic (_, Just (TSortSeq _ _)) = True
isVariadic _ = False
data ParamPattern = PPMetaVar MetaVar
| PPSeqMetaVar MetaVar SeqSortOp
| PPAny
deriving (Eq,Ord,Show)
data FStep = FStep
{ stepSource :: Maybe [FPattern]
, stepTarget :: FTerm
, stepInheritedEntities :: [(Name,[FPattern])]
, stepMutableEntities :: ([(Name,FPattern)],[(Name,FTerm)])
, stepInputEntities :: [(Name,FPattern)]
, stepOutputEntities :: [(Name,FTerm)]
, stepControlEntities :: [(Name,FPattern)]
}
deriving (Eq,Ord,Show)
data FPremiseStep = FPremiseStep
{ premiseSource :: FTerm
, premiseTarget :: [FPattern]
, premiseInheritedEntities :: [(Name,FTerm)]
, premiseMutableEntities :: ([(Name,FTerm)],[(Name,FPattern)])
, premiseInputEntities :: [(Name,FTerm)]
, premiseOutputEntities :: [(Name,FPattern)]
, premiseControlEntities :: [(Name,FPattern)]
}
deriving (Eq,Ord,Show)
data FPattern = PSeq [FPattern]
| PList [FPattern]
| PEmptySet
| PAnnotated FPattern FSort
| PADT ADTConstructor [FPattern]
| PAny
| PLit FLiteral
| PMetaVar MetaVar
| PSeqMetaVar MetaVar SeqSortOp -- Note: the MetaVar should also contain the operator suffix
deriving (Eq,Ord,Show)
data FLiteral = FLiteralNat Int
| FLiteralFloat Double
| FLiteralString String
| FLiteralAtom String
deriving (Eq,Ord,Show)
type ADTConstructor = String
type FSort = FTerm
type MetaVar = String
data FTerm = TMetaVar MetaVar
| TLiteral FLiteral
| TName Name
| TApp Name [FTerm]
| TTuple [FTerm]
| TList [FTerm]
| TSet [FTerm]
| TMap [FTerm]
| TBinding FTerm FTerm
| TSortPower FTerm FTerm
| TSortUnion FTerm FTerm
| TSortInter FTerm FTerm
| TSortComplement FTerm
| TSortSeq FTerm SeqSortOp
| TSortComputes FTerm
| TSortComputesFrom FTerm FTerm
| TAny
deriving (Eq,Ord,Show)
termArgs :: FTerm -> Maybe [FTerm]
termArgs t = case t of
TName _ -> Nothing
TApp _ ts -> Just ts
_ -> Nothing
-------------------------------------------------