liquidhaskell-0.8.0.0: src/Language/Haskell/Liquid/UX/Config.hs
--------------------------------------------------------------------------------
-- | Command Line Config Options -----------------------------------------------
--------------------------------------------------------------------------------
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
module Language.Haskell.Liquid.UX.Config (
-- * Configuration Options
Config (..)
, HasConfig (..)
, hasOpt
, totalityCheck
, terminationCheck
, Instantiate (..)
, allowSMTInstationation
, allowLiquidInstationation
, allowLiquidInstationationGlobal
, allowLiquidInstationationLocal
, ProofMethod (..)
, allowRewrite
, allowArithmetic
) where
import Prelude hiding (error)
import Data.Serialize ( Serialize )
import Language.Fixpoint.Types.Config hiding (Config)
-- import Data.Typeable (Typeable)
-- import Data.Generics (Data)
import GHC.Generics
import System.Console.CmdArgs
totalityCheck :: Config -> Bool
totalityCheck config
= totality config || totalHaskell config
terminationCheck :: Config -> Bool
terminationCheck config
= totalHaskell config || not (notermination config)
-- NOTE: adding strictness annotations breaks the help message
data Config = Config {
files :: [FilePath] -- ^ source files to check
, idirs :: [FilePath] -- ^ path to directory for including specs
, diffcheck :: Bool -- ^ check subset of binders modified (+ dependencies) since last check
, linear :: Bool -- ^ uninterpreted integer multiplication and division
, stringTheory :: Bool -- ^ interpretation of string theory in the logic
, higherorder :: Bool -- ^ allow higher order binders into the logic
, higherorderqs :: Bool -- ^ allow higher order qualifiers
, extensionality :: Bool -- ^ allow function extentionality axioms
, alphaEquivalence :: Bool -- ^ allow lambda alpha-equivalence axioms
, betaEquivalence :: Bool -- ^ allow lambda beta-equivalence axioms
, normalForm :: Bool -- ^ allow lambda normalization-equivalence axioms
, fullcheck :: Bool -- ^ check all binders (overrides diffcheck)
, saveQuery :: Bool -- ^ save fixpoint query
, checks :: [String] -- ^ set of binders to check
, noCheckUnknown :: Bool -- ^ whether to complain about specifications for unexported and unused values
, notermination :: Bool -- ^ disable termination check
, gradual :: Bool -- ^ enable gradual type checking
, totalHaskell :: Bool -- ^ Check for termination and totality, Overrides no-termination flags
, autoproofs :: Bool -- ^ automatically construct proofs from axioms
, nowarnings :: Bool -- ^ disable warnings output (only show errors)
, noannotations :: Bool -- ^ disable creation of intermediate annotation files
, trustInternals :: Bool -- ^ type all internal variables with true
, nocaseexpand :: Bool -- ^ disable case expand
, strata :: Bool -- ^ enable strata analysis
, notruetypes :: Bool -- ^ disable truing top level types
, totality :: Bool -- ^ check totality in definitions
, pruneUnsorted :: Bool -- ^ enable prunning unsorted Refinements
, cores :: Maybe Int -- ^ number of cores used to solve constraints
, minPartSize :: Int -- ^ Minimum size of a partition
, maxPartSize :: Int -- ^ Maximum size of a partition. Overrides minPartSize
, maxParams :: Int -- ^ the maximum number of parameters to accept when mining qualifiers
, smtsolver :: Maybe SMTSolver -- ^ name of smtsolver to use [default: try z3, cvc4, mathsat in order]
, shortNames :: Bool -- ^ drop module qualifers from pretty-printed names.
, shortErrors :: Bool -- ^ don't show subtyping errors and contexts.
, cabalDir :: Bool -- ^ find and use .cabal file to include paths to sources for imported modules
, ghcOptions :: [String] -- ^ command-line options to pass to GHC
, cFiles :: [String] -- ^ .c files to compile and link against (for GHC)
, eliminate :: Eliminate -- ^ eliminate (i.e. don't use qualifs for) for "none", "cuts" or "all" kvars
-- , noEliminate :: Bool -- ^ don't eliminate non-top-level and non-recursive KVars
--, oldEliminate :: Bool -- ^ use old eliminate algorithm (for benchmarking only)
, port :: Int -- ^ port at which lhi should listen
, exactDC :: Bool -- ^ Automatically generate singleton types for data constructors
, noMeasureFields :: Bool -- ^ Do not automatically lift data constructor fields into measures
, scrapeImports :: Bool -- ^ scrape qualifiers from imported specifications
, scrapeInternals :: Bool -- ^ scrape qualifiers from auto specifications
, scrapeUsedImports :: Bool -- ^ scrape qualifiers from used, imported specifications
, elimStats :: Bool -- ^ print eliminate stats
, elimBound :: Maybe Int -- ^ eliminate upto given depth of KVar chains
, json :: Bool -- ^ print results (safe/errors) as JSON
, counterExamples :: Bool -- ^ attempt to generate counter-examples to type errors
, timeBinds :: Bool -- ^ check and time each (asserted) type-sig separately
, noPatternInline :: Bool -- ^ treat code patterns (e.g. e1 >>= \x -> e2) specially for inference
, untidyCore :: Bool -- ^ print full blown core (with untidy names) in verbose mode
, noSimplifyCore :: Bool -- ^ simplify GHC core before constraint-generation
, nonLinCuts :: Bool -- ^ treat non-linear kvars as cuts
, autoInstantiate :: Instantiate -- ^ How to instantiate axioms
, proofMethod :: ProofMethod -- ^ How to create automatic instances
, fuel :: Int -- ^ Fuel for axiom instantiation
, debugInstantionation :: Bool -- ^ Debug Instantiation
, noslice :: Bool -- ^ Disable non-concrete KVar slicing
} deriving (Generic, Data, Typeable, Show, Eq)
instance Serialize ProofMethod
instance Serialize Instantiate
instance Serialize SMTSolver
instance Serialize Config
data Instantiate = NoInstances | SMTInstances | LiquidInstances | LiquidInstancesLocal
deriving (Eq, Data, Typeable, Generic)
data ProofMethod = Arithmetic | Rewrite | AllMethods
deriving (Eq, Data, Typeable, Generic)
allowSMTInstationation, allowLiquidInstationation, allowLiquidInstationationLocal, allowLiquidInstationationGlobal :: Config -> Bool
allowSMTInstationation cfg = autoInstantiate cfg == SMTInstances
allowLiquidInstationation cfg = autoInstantiate cfg == LiquidInstances
|| autoInstantiate cfg == LiquidInstancesLocal
allowLiquidInstationationGlobal cfg = autoInstantiate cfg == LiquidInstances
allowLiquidInstationationLocal cfg = autoInstantiate cfg == LiquidInstancesLocal
allowRewrite, allowArithmetic :: Config -> Bool
allowRewrite cfg = proofMethod cfg == Rewrite || proofMethod cfg == AllMethods
allowArithmetic cfg = proofMethod cfg == Arithmetic || proofMethod cfg == AllMethods
instance Default ProofMethod where
def = Rewrite
instance Show ProofMethod where
show Arithmetic = "arithmetic"
show Rewrite = "rewrite"
show AllMethods = "all"
instance Default Instantiate where
def = NoInstances
instance Show Instantiate where
show NoInstances = "none"
show SMTInstances = "SMT"
show LiquidInstancesLocal = "liquid-local"
show LiquidInstances = "liquid-global"
class HasConfig t where
getConfig :: t -> Config
patternFlag :: t -> Bool
-- NV: This edit goes with the similar edit in Config.hs
patternFlag = const False
-- patternFlag = not . noPatternInline . getConfig
higherOrderFlag :: t -> Bool
higherOrderFlag = higherorder . getConfig
hasOpt :: HasConfig t => t -> (Config -> Bool) -> Bool
hasOpt t f = f (getConfig t)
instance HasConfig Config where
getConfig = id