packages feed

language-smtlib-0.1.0.0: src/Language/SMTLIB/Syntax/Datatype.hs

-- | Declarations for sorts, datatypes and (recursive) function definitions.
module Language.SMTLIB.Syntax.Datatype
  ( SortDec(..)
  , SelectorDec(..)
  , ConstructorDec(..)
  , DatatypeDec(..)
  , FunctionDec(..)
  , FunctionDef(..)
  ) where

import Language.SMTLIB.Syntax.Annotation (Annotated(..))
import Language.SMTLIB.Syntax.Constant (Symbol)
import Language.SMTLIB.Syntax.Identifier (Sort)
import Language.SMTLIB.Syntax.Term (SortedVar, Term)

-- | A @sort_dec@ @(symbol numeral)@ heading a @declare-datatypes@.
data SortDec a = SortDec !Symbol !Integer a
  deriving (Show, Eq, Functor, Foldable, Traversable)

-- | A @selector_dec@ @(symbol sort)@.
data SelectorDec a = SelectorDec !Symbol (Sort a) a
  deriving (Show, Eq, Functor, Foldable, Traversable)

-- | A @constructor_dec@ @(symbol selector_dec*)@.
data ConstructorDec a = ConstructorDec !Symbol [SelectorDec a] a
  deriving (Show, Eq, Functor, Foldable, Traversable)

-- | A @datatype_dec@.  The first field holds the @par@ type variables; it is
-- empty for a non-parametric @(constructor_dec+)@ declaration and non-empty for
-- a @(par (u+) (constructor_dec+))@ declaration.
data DatatypeDec a = DatatypeDec [Symbol] [ConstructorDec a] a
  deriving (Show, Eq, Functor, Foldable, Traversable)

-- | A @function_dec@ @(symbol (sorted_var*) sort)@, used by @define-funs-rec@.
data FunctionDec a = FunctionDec !Symbol [SortedVar a] (Sort a) a
  deriving (Show, Eq, Functor, Foldable, Traversable)

-- | A @function_def@ @symbol (sorted_var*) sort term@, used by @define-fun@ and
-- @define-fun-rec@.
data FunctionDef a = FunctionDef !Symbol [SortedVar a] (Sort a) (Term a) a
  deriving (Show, Eq, Functor, Foldable, Traversable)

instance Annotated SortDec where
  ann (SortDec _ _ a) = a
  setAnn a (SortDec s n _) = SortDec s n a

instance Annotated SelectorDec where
  ann (SelectorDec _ _ a) = a
  setAnn a (SelectorDec s t _) = SelectorDec s t a

instance Annotated ConstructorDec where
  ann (ConstructorDec _ _ a) = a
  setAnn a (ConstructorDec s ss _) = ConstructorDec s ss a

instance Annotated DatatypeDec where
  ann (DatatypeDec _ _ a) = a
  setAnn a (DatatypeDec ps cs _) = DatatypeDec ps cs a

instance Annotated FunctionDec where
  ann (FunctionDec _ _ _ a) = a
  setAnn a (FunctionDec s vs r _) = FunctionDec s vs r a

instance Annotated FunctionDef where
  ann (FunctionDef _ _ _ _ a) = a
  setAnn a (FunctionDef s vs r t _) = FunctionDef s vs r t a