eflint-4.1.0.1: src/Language/EFLINT/FormExtraction.hs
{-# LANGUAGE TupleSections #-}
module Language.EFLINT.FormExtraction where
import Language.EFLINT.Spec
import Language.EFLINT.State
import Language.EFLINT.Eval
import Data.List ((\\))
import qualified Data.Map as M
import qualified Data.Set as S
form_all_open :: Spec -> State -> S.Set MissingInput
form_all_open spec = form_from_set (M.keysSet (decls spec)) spec
form_from_phrases :: [Phrase] -> Spec -> State -> S.Set MissingInput
form_from_phrases ps spec state = form_from_set reachables spec state
where reachables = S.unions (map (reachable spec) ps)
reachable :: Spec -> Phrase -> S.Set DomId
reachable spec p = M.keysSet (decls spec)
{-
PDo Tagged
| PTrigger [Var] Term
| Create [Var] Term
| Terminate [Var] Term
| Obfuscate [Var] Term
| PQuery Term
| PInstQuery [Var] Term
| PDeclBlock [Decl]
| PSkip
-}
reachable_term :: Spec -> Term -> S.Set DomId
reachable_term spec term = S.empty
reachable_foreach :: Spec -> [Var] -> Term -> S.Set DomId
reachable_foreach spec vars t =
S.fromList (map (remove_decoration spec) vars) `S.union` reachable_term spec t
form_from_set :: S.Set DomId -> Spec -> State -> S.Set MissingInput
form_from_set set spec state =
S.map (mk_missing spec state) $ S.filter isOpen set
where isOpen d = case closed_type spec d of Just False -> True
_ -> False
mk_missing :: Spec -> State -> DomId {- open -} -> MissingInput
mk_missing spec state d =
case runSubs (every_valid_subs (no_decoration d)) spec state M.empty of
Left (MissingInput mi) -> mi -- either MissingAssignments or MissingInstances
Left err -> error $ "assert 2 mk_missing" ++ print_runtime_error err
Right tes -> missing_assignments trues falses ((tes \\ trues) \\ falses) (restriction_of spec d)
where (trues, falses) = assigned_instances state d