packages feed

language-smtlib-0.2.0.0: src/Language/SMTLIB/Syntax/Command.hs

-- | Top-level commands of an SMT-LIB 2 script.
module Language.SMTLIB.Syntax.Command
  ( Command(..)
  , Option(..)
  , InfoFlag(..)
  , Script
  ) where

import Data.Hashable (Hashable)
import Data.Text (Text)
import GHC.Generics (Generic)

import Language.SMTLIB.Syntax.Annotation (Annotated(..))
import Language.SMTLIB.Syntax.Attribute (Attribute, SExpr)
import Language.SMTLIB.Syntax.Constant (Keyword, Symbol)
import Language.SMTLIB.Syntax.Datatype
  (DatatypeDec, FunctionDec, FunctionDef, SortDec)
import Language.SMTLIB.Syntax.Identifier (Sort)
import Language.SMTLIB.Syntax.Term (Term)

-- | An @option@ for @set-option@.
data Option a
  = DiagnosticOutputChannel    !Text          a
  | GlobalDeclarations         !Bool          a
  | InteractiveMode            !Bool          a
  | PrintSuccess               !Bool          a
  | ProduceAssertions          !Bool          a
  | ProduceAssignments         !Bool          a
  | ProduceModels              !Bool          a
  | ProduceProofs              !Bool          a
  | ProduceUnsatAssumptions    !Bool          a
  | ProduceUnsatCores          !Bool          a
  | RandomSeed                 !Integer       a
  | RegularOutputChannel       !Text          a
  | ReproducibleResourceLimit  !Integer       a
  | Verbosity                  !Integer       a
  | OptionAttribute            (Attribute a)  a
  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)

-- | An @info_flag@ for @get-info@.
data InfoFlag a
  = AllStatistics       a
  | AssertionStackLevels a
  | Authors             a
  | ErrorBehaviorFlag   a
  | InfoName            a
  | ReasonUnknownFlag   a
  | InfoVersion         a
  | InfoFlagKeyword !Keyword a
  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)

-- | A top-level @command@.
data Command a
  = SetLogic         !Symbol                            a
  | SetOption        (Option a)                         a
  | SetInfo          (Attribute a)                      a
  | DeclareSort      !Symbol !Integer                   a
  | DeclareSortParameter !Symbol                        a  -- ^ SMT-LIB 2.7
  | DefineSort       !Symbol [Symbol] (Sort a)          a
  | DeclareConst     !Symbol (Sort a)                   a
  | DefineConst      !Symbol (Sort a) (Term a)          a  -- ^ SMT-LIB 2.7
  | DeclareFun       !Symbol [Sort a] (Sort a)          a
  | DefineFun        (FunctionDef a)                    a
  | DefineFunRec     (FunctionDef a)                    a
  | DefineFunsRec    [FunctionDec a] [Term a]           a
  | DeclareDatatype  !Symbol (DatatypeDec a)            a
  | DeclareDatatypes [SortDec a] [DatatypeDec a]        a
  | Push             !Integer                           a
  | Pop              !Integer                           a
  | Reset            a
  | ResetAssertions  a
  | Assert           (Term a)                           a
  | CheckSat         a
  | CheckSatAssuming [Term a]                           a  -- ^ assumptions: arbitrary Bool terms (SMT-LIB 2.7; was @prop_literal@)
  | GetAssertions    a
  | GetModel         a
  | GetProof         a
  | GetUnsatCore     a
  | GetUnsatAssumptions a
  | GetValue         [Term a]                           a
  | GetAssignment    a
  | GetOption        !Keyword                           a
  | GetInfo          (InfoFlag a)                       a
  | Echo             !Text                              a
  | Exit             a
  | UnknownCommand   !Symbol [SExpr a]                  a
    -- ^ A syntactically well-formed command whose head keyword is not one of
    -- the recognized commands above.  Carries the head keyword and the raw
    -- argument s-expressions so the application can decide how to handle it.
    -- Only produced by the lenient parsers
    -- (@Language.SMTLIB.Parser.Command.pCommandLenient@ \/ @pScriptLenient@);
    -- the strict parsers reject an unknown head keyword instead.
  deriving (Show, Eq, Ord, Functor, Foldable, Traversable, Generic)

-- | A script is a sequence of commands.
type Script a = [Command a]

instance Hashable a => Hashable (Option a)
instance Hashable a => Hashable (InfoFlag a)
instance Hashable a => Hashable (Command a)

instance Annotated Option where
  ann = \case
    DiagnosticOutputChannel _ a   -> a
    GlobalDeclarations _ a        -> a
    InteractiveMode _ a           -> a
    PrintSuccess _ a              -> a
    ProduceAssertions _ a         -> a
    ProduceAssignments _ a        -> a
    ProduceModels _ a             -> a
    ProduceProofs _ a             -> a
    ProduceUnsatAssumptions _ a   -> a
    ProduceUnsatCores _ a         -> a
    RandomSeed _ a                -> a
    RegularOutputChannel _ a      -> a
    ReproducibleResourceLimit _ a -> a
    Verbosity _ a                 -> a
    OptionAttribute _ a           -> a
  setAnn a = \case
    DiagnosticOutputChannel x _   -> DiagnosticOutputChannel x a
    GlobalDeclarations x _        -> GlobalDeclarations x a
    InteractiveMode x _           -> InteractiveMode x a
    PrintSuccess x _              -> PrintSuccess x a
    ProduceAssertions x _         -> ProduceAssertions x a
    ProduceAssignments x _        -> ProduceAssignments x a
    ProduceModels x _             -> ProduceModels x a
    ProduceProofs x _             -> ProduceProofs x a
    ProduceUnsatAssumptions x _   -> ProduceUnsatAssumptions x a
    ProduceUnsatCores x _         -> ProduceUnsatCores x a
    RandomSeed x _                -> RandomSeed x a
    RegularOutputChannel x _      -> RegularOutputChannel x a
    ReproducibleResourceLimit x _ -> ReproducibleResourceLimit x a
    Verbosity x _                 -> Verbosity x a
    OptionAttribute x _           -> OptionAttribute x a

instance Annotated InfoFlag where
  ann = \case
    AllStatistics a        -> a
    AssertionStackLevels a -> a
    Authors a              -> a
    ErrorBehaviorFlag a    -> a
    InfoName a             -> a
    ReasonUnknownFlag a    -> a
    InfoVersion a          -> a
    InfoFlagKeyword _ a    -> a
  setAnn a = \case
    AllStatistics _        -> AllStatistics a
    AssertionStackLevels _ -> AssertionStackLevels a
    Authors _              -> Authors a
    ErrorBehaviorFlag _    -> ErrorBehaviorFlag a
    InfoName _             -> InfoName a
    ReasonUnknownFlag _    -> ReasonUnknownFlag a
    InfoVersion _          -> InfoVersion a
    InfoFlagKeyword k _    -> InfoFlagKeyword k a

instance Annotated Command where
  ann = \case
    SetLogic _ a            -> a
    SetOption _ a           -> a
    SetInfo _ a             -> a
    DeclareSort _ _ a       -> a
    DeclareSortParameter _ a -> a
    DefineSort _ _ _ a      -> a
    DeclareConst _ _ a      -> a
    DefineConst _ _ _ a     -> a
    DeclareFun _ _ _ a      -> a
    DefineFun _ a           -> a
    DefineFunRec _ a        -> a
    DefineFunsRec _ _ a     -> a
    DeclareDatatype _ _ a   -> a
    DeclareDatatypes _ _ a  -> a
    Push _ a                -> a
    Pop _ a                 -> a
    Reset a                 -> a
    ResetAssertions a       -> a
    Assert _ a              -> a
    CheckSat a              -> a
    CheckSatAssuming _ a    -> a
    GetAssertions a         -> a
    GetModel a              -> a
    GetProof a              -> a
    GetUnsatCore a          -> a
    GetUnsatAssumptions a   -> a
    GetValue _ a            -> a
    GetAssignment a         -> a
    GetOption _ a           -> a
    GetInfo _ a             -> a
    Echo _ a                -> a
    Exit a                  -> a
    UnknownCommand _ _ a    -> a
  setAnn a = \case
    SetLogic x _            -> SetLogic x a
    SetOption x _           -> SetOption x a
    SetInfo x _             -> SetInfo x a
    DeclareSort x y _       -> DeclareSort x y a
    DeclareSortParameter x _ -> DeclareSortParameter x a
    DefineSort x y z _      -> DefineSort x y z a
    DeclareConst x y _      -> DeclareConst x y a
    DefineConst x y z _     -> DefineConst x y z a
    DeclareFun x y z _      -> DeclareFun x y z a
    DefineFun x _           -> DefineFun x a
    DefineFunRec x _        -> DefineFunRec x a
    DefineFunsRec x y _     -> DefineFunsRec x y a
    DeclareDatatype x y _   -> DeclareDatatype x y a
    DeclareDatatypes x y _  -> DeclareDatatypes x y a
    Push x _                -> Push x a
    Pop x _                 -> Pop x a
    Reset _                 -> Reset a
    ResetAssertions _       -> ResetAssertions a
    Assert x _              -> Assert x a
    CheckSat _              -> CheckSat a
    CheckSatAssuming x _    -> CheckSatAssuming x a
    GetAssertions _         -> GetAssertions a
    GetModel _              -> GetModel a
    GetProof _              -> GetProof a
    GetUnsatCore _          -> GetUnsatCore a
    GetUnsatAssumptions _   -> GetUnsatAssumptions a
    GetValue x _            -> GetValue x a
    GetAssignment _         -> GetAssignment a
    GetOption x _           -> GetOption x a
    GetInfo x _             -> GetInfo x a
    Echo x _                -> Echo x a
    Exit _                  -> Exit a
    UnknownCommand kw xs _  -> UnknownCommand kw xs a