CurryInfo: contract-prover-4.0.0 / ContractProver.addPreConditions

definition: Info
 
addPreConditions :: Options -> TAProg -> IORef VState -> IO TAProg
addPreConditions _ prog vstref = do
  newfuns  <- mapM addPreCondition (progFuncs prog)
  return (updProgFuncs (const (concat newfuns)) prog)
 where
  addPreCondition fdecl@(AFunc qf ar vis fty rule) = do
    ti <- readVerifyInfoRef vstref
    return $
      if toPreCondQName qf `elem` map funcName (preConds ti)
        then let newrule = checkPreCondRule qf rule
             in [updFuncRule (const newrule) fdecl,
                 AFunc (toNoCheckQName qf) ar vis fty rule]
        else [fdecl]

  checkPreCondRule :: QName -> TARule -> TARule
  checkPreCondRule qn (ARule rty rargs _) =
    ARule rty rargs (addPreConditionCheck rty FuncCall qn rty
                       (map (\ (v,t) -> AVar t v) rargs))
  checkPreCondRule qn (AExternal _ _) = error $
    "addPreConditions: cannot add precondition to external operation '" ++
    snd qn ++ "'!"
demand: Info
 no demanded arguments
deterministic: Info
 deterministic operation
documentation: Info
 
---------------------------------------------------------------------------
Add (non-trivial) preconditions:
If an operation `f` has some precondition `f'pre`,
replace the rule `f xs = rhs` by the following rules:

    f xs = checkPreCond (f'NOCHECK xs) (f'pre xs) "f" xs
    f'NOCHECK xs = rhs
failfree: Info
 <FAILING>
indeterministic: Info
 referentially transparent operation
infix: Info
 no fixity defined
iotype: Info
 {(_,_,_) |-> _}
name: Info
 addPreConditions
precedence: Info
 no precedence defined
result-values: Info
 _
signature: Info
 ToolOptions.Options -> FlatCurry.Annotated.Types.AProg FlatCurry.Types.TypeExpr
-> Data.IORef.IORef VerifierState.VState
-> Prelude.IO (FlatCurry.Annotated.Types.AProg FlatCurry.Types.TypeExpr)
solution-complete: Info
 operation might suspend on free variables
terminating: Info
 possibly non-terminating
totally-defined: Info
 possibly non-reducible on same data term