-- | The identity of the comorphism
data Modal2CASL = Modal2CASL deriving (Show)
instance Language Modal2CASL -- default definition is okay
instance Comorphism Modal2CASL
M_BASIC_SPEC ModalFORMULA SYMB_ITEMS SYMB_MAP_ITEMS
CASLBasicSpec CASLFORMULA SYMB_ITEMS SYMB_MAP_ITEMS
Symbol RawSymbol ProofTree where
sourceLogic Modal2CASL = Modal
sourceSublogic Modal2CASL = ()
targetLogic Modal2CASL = CASL
map_theory (Modal2CASL) (sig, sens) = case transSig sig of
mme -> return (caslSign mme, relFormulas mme
++ map (mapNamed $ transSen sig) sens)
map_morphism Modal2CASL = return . mapMor
map_sentence Modal2CASL sig = return . transSen sig
has_model_expansion Modal2CASL = True
is_weakly_amalgamable Modal2CASL = True
data ModName = SimpleM SIMPLE_ID
-- | relations on possible worlds
type ModalityRelMap =
Map.Map ModName PRED_NAME
, modalityRelMap :: ModalityRelMap
, relFormulas :: [Named CASLFORMULA] }
transSig :: MSign -> ModMapEnv
let extInf = extendedInfo sign
flexibleOps = flexOps extInf
flexiblePreds = flexPreds extInf
flexOps' = addWorldOp fws addPlace flexibleOps
$ addWorldPred fws addPlace flexiblePreds
rigOps' = diffOpMapSet (opMap sign) flexibleOps
rigPreds' = diffMapSet (predMap sign) flexiblePreds
relSymbS me = Id [genToken "R"] [mkId [me]] $ tokPos me
relSymbT me = Id [genToken "R_t"] [me] $ rangeOfId me
modiesInf = modies extInf
trmMods = termModies extInf
relsMod = genRels (\ me nm ->
Map.insert (SimpleM me) (relSymbS me) nm)
relsTermMod = genRels (\ me nm ->
relModFrms = genModFrms (\ me frms trFrms -> trFrms ++
transSchemaMFormulas partMME
relTermModFrms = genModFrms (\ me frms trFrms -> trFrms ++
transSchemaMFormulas partMME
addWorldRels isTermMod rels mp =
let argSorts rs = if isTermMod
then [getModTermSort rs, fws, fws]
partMME = MME {caslSign =
, opMap = addOpMapSet flexOps' rigOps'
, assocOps = diffOpMapSet (assocOps sign) flexibleOps
, predMap = addMapSet flexPreds' rigPreds'},
modalityRelMap = relations,
flexiPreds = flexiblePreds,
in partMME { relFormulas = relModFrms ++ relTermModFrms}
mapMor :: ModalMor -> CASLMor
mapMor m = (embedMorphism ()
(caslSign $ transSig $ msource m)
$ caslSign $ transSig $ mtarget m)
, pred_map = pred_map m }
mapSym :: Symbol -> Symbol
mapSym = id -- needs to be changed once modal symbols are added
transSchemaMFormulas :: ModMapEnv -> SORT -> PRED_NAME
-> [AnModFORM] -> [Named CASLFORMULA]
transSchemaMFormulas mapEnv fws relSymb =
mapMaybe (transSchemaMFormula (mapTERM mapEnv) fws relSymb worldVars)
transSen :: MSign -> ModalFORMULA -> CASLFORMULA
transSen msig = mapSenTop (transSig msig)
mapSenTop :: ModMapEnv -> ModalFORMULA -> CASLFORMULA
mapSenTop mapEnv@(MME {worldSort = fws}) f =
Quantification q@Universal vs frm ps ->
Quantification q (qwv : vs) (mapSen mapEnv wvs frm) ps
f1 -> Quantification Universal [qwv] (mapSen mapEnv wvs f1) nullRange
where qwv = Var_decl wvs fws nullRange
-- head [VAR] is always the current world variable (for predication)
mapSen :: ModMapEnv -> [VAR] -> ModalFORMULA -> CASLFORMULA
mapSen mapEnv@(MME {worldSort = fws, flexiPreds = fPreds}) vars
Quantification q vs frm ps ->
Quantification q vs (mapSen mapEnv vars frm) ps
Junction j (map (mapSen mapEnv vars) fs) ps
Relation (mapSen mapEnv vars f1) c (mapSen mapEnv vars f2) ps
Negation frm ps -> Negation (mapSen mapEnv vars frm) ps
Equation t1 e t2 ps -> Equation
(mapTERM mapEnv vars t1) e (mapTERM mapEnv vars t2) ps
let as' = map (mapTERM mapEnv vars) as
fwsTerm = sortedWorldTerm fws (head vars)
Pred_name _ -> error "Modal2CASL: untyped predication"
Qual_pred_name prn pType@(Pred_type sorts pps) ps ->
let addTup = (Qual_pred_name (addPlace prn)
(Pred_type (fws : sorts) pps) ps,
in Predication pn' as'' qs
Definedness t ps -> Definedness (mapTERM mapEnv vars t) ps
Membership t ty ps -> Membership (mapTERM mapEnv vars t) ty ps
Sort_gen_ax constrs isFree -> Sort_gen_ax constrs isFree
ExtFORMULA mf -> mapMSen mapEnv vars mf
mapMSen :: ModMapEnv -> [VAR] -> M_FORMULA -> CASLFORMULA
mapMSen mapEnv@(MME {worldSort = fws, modalityRelMap = pwRelMap}) vars f
= let trans_f1 = mkId [mkSimpleId "Placeholder for Formula"]
t_var = mkSimpleId "Placeholder for Modality Term"
(w1, w2, newVars) = assert (not (null vars))
(let hd = freshWorldVar vars
in (head vars, hd, hd : vars))
(error ("Modal2CASL: Undefined modality " ++ show mo))
trans' mTerm propSymb trForm nvs f1 =
replacePropPredication mTerm
propSymb (mapSen mapEnv nvs f1) trForm
mapT = mapTERM mapEnv newVars
mkPredType ts = Pred_type ts nullRange
joinPreds b t1 t2 = if b then mkImpl t1 t2 else conjunct [t1, t2]
quantForm b vs = if b then mkForall vs else
mkForall (init vs) . mkExist [last vs]
transPred = mkPredication (mkQualPred trans_f1 $ mkPredType []) []
BoxOrDiamond b moda f1 _ ->
let rel = getRel moda pwRelMap in
newFormula = quantForm b [vw1, vw2]
(mkQualPred rel $ mkPredType [fws, fws])
[toQualVar vw1, toQualVar vw2])
in trans' Nothing trans_f1 newFormula newVars f1
let tt = getModTermSort rel
newFormula = quantForm b [vtt, vw1, vw2]
(mkQualPred rel $ mkPredType [tt, fws, fws])
[toQualVar vtt, toQualVar vw1, toQualVar vw2])
in trans' (Just (rel, t_var, mapT t))
-- head [VAR] is always the current world variable (for Application)
mapTERM :: ModMapEnv -> [VAR] -> TERM M_FORMULA -> TERM ()
mapTERM mapEnv@(MME {worldSort = fws, flexiOps = fOps}) vars t = case t of
Qual_var v ty ps -> Qual_var v ty ps
Application opsym as qs ->
let as' = map (mapTERM mapEnv vars) as
fwsTerm = sortedWorldTerm fws (head vars)
addFws (Op_type k sorts res pps) =
Op_type k (fws : sorts) res pps
Op_name _ -> error "Modal2CASL: untyped prdication"
Qual_op_name on opType ps ->
let addTup = (Qual_op_name (addPlace on)
in Application opsym' as'' qs
Sorted_term trm ty ps -> Sorted_term (mapTERM mapEnv vars trm) ty ps
Cast trm ty ps -> Cast (mapTERM mapEnv vars trm) ty ps
Conditional t1 f t2 ps ->
Conditional (mapTERM mapEnv vars t1)
(mapTERM mapEnv vars t2) ps
modalityToModName :: MODALITY -> ModName
modalityToModName (Simple_mod sid) = SimpleM sid
modalityToModName (Term_mod t) =
Nothing -> error ("Modal2CASL: modalityToModName: Wrong term: " ++ show t)
sortedWorldTerm :: SORT -> VAR -> TERM ()
sortedWorldTerm fws v = Sorted_term (Qual_var v fws nullRange) fws nullRange
-- List of variables for worlds
worldVars = map (genNumVar "w") [1 ..]
freshWorldVar :: [SIMPLE_ID] -> SIMPLE_ID
freshWorldVar vs = head $ filter notKnown worldVars
where notKnown v = notElem v vs