OMDocImport.hs revision 59597e83448c2fc763557b56e0319615b33518d9
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceModule : $Header$
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceDescription : OMDoc-to-CASL conversion
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceCopyright : (c) Ewaryst Schulz, DFKI Bremen 2009
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceLicense : GPLv2 or higher, see LICENSE.txt
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceMaintainer : ewaryst.schulz@dfki.de
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceStability : provisional
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancePortability : portable
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceCASL implementation of the interface functions omdocToSym, omdocToSen
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance, addOMadtToTheory, addOmdocToTheory from class Logic. The actual
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Manceinstantiation can be found in module "CASL.Logic_CASL".
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance , addOMadtToTheory
808e2693447ecc5a311a2b9de6b81ca07f193778Felix Gabriel Mance , addOmdocToTheory
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Manceimport qualified Common.Lib.Rel as Rel
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Manceimport qualified Data.Map as Map
808e2693447ecc5a311a2b9de6b81ca07f193778Felix Gabriel Mance-- * Environment Interface
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mancetype Env = SigMapI Symbol
808e2693447ecc5a311a2b9de6b81ca07f193778Felix Gabriel MancesymbolToSort :: Symbol -> SORT
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToSort (Symbol n SortAsItemType) = n
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToSort s = error $ "symbolToSort: Nonsort encountered: " ++ show s
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToOp :: Symbol -> (Id, OpType)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToOp (Symbol n (OpAsItemType ot)) = (n, ot)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToOp s = error $ "symbolToOp: Nonop encountered: " ++ show s
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToPred :: Symbol -> (Id, PredType)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToPred (Symbol n (PredAsItemType pt)) = (n, pt)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancesymbolToPred s = error $ "symbolToPred: Nonpred encountered: " ++ show s
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupSymbol :: Env -> OMName -> Symbol
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupSymbol e omn =
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance (error $ concat [ "lookupSymbol failed for: "
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance , show omn, "\nmap: ", show $ sigMapISymbs e])
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance omn $ sigMapISymbs e
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupSort :: Env -> OMName -> SORT
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupSort e = symbolToSort . lookupSymbol e
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupSortOMS :: String -> Env -> OMElement -> SORT
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupSortOMS msg = lookupOMS lookupSort $ msg ++ "(SORT)"
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupPred :: Env -> OMName -> (Id, PredType)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupPred e = symbolToPred . lookupSymbol e
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupPredOMS :: String -> Env -> OMElement -> (Id, PredType)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupPredOMS msg = lookupOMS lookupPred $ msg ++ "(PRED)"
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOp :: Env -> OMName -> (Id, OpType)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOp e = symbolToOp . lookupSymbol e
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOpOMS :: String -> Env -> OMElement -> (Id, OpType)
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOpOMS msg = lookupOMS lookupOp $ msg ++ "(Op)"
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOMS :: (Env -> OMName -> a) -> String -> Env -> OMElement -> a
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOMS f msg e oms@(OMS (cd, omn)) =
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance if cdIsEmpty cd then f e omn
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance else error $ concat [ msg, ": lookupOMS: Nonempty cd in const: "
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancelookupOMS _ msg _ ome =
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance error $ concat [msg, ": lookupOMS: Nonsymbol: ", show ome]
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancetoOpSymb :: (Id, OpType) -> OP_SYMB
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancetoOpSymb (i, t) = Qual_op_name i (toOP_TYPE t) nullRange
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancetoPredSymb :: (Id, PredType) -> PRED_SYMB
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel MancetoPredSymb (i, t) = Qual_pred_name i (toPRED_TYPE t) nullRange
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance-- * TOPLEVEL Interface
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance-- | A TCSymbols is transformed to a CASL symbol with given name.
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel ManceomdocToSym :: Env -> TCElement -> String -> Result Symbol
808e2693447ecc5a311a2b9de6b81ca07f193778Felix Gabriel ManceomdocToSym e sym@(TCSymbol _ ctp srole _) n =
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance Typ | ctp == const_sort -> return $ idToSortSymbol $ nameToId n
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance | otherwise -> fail $ "omdocToSym: No sorttype for " ++ show sym
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance Obj -> return $
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance case omdocToType e ctp of
808e2693447ecc5a311a2b9de6b81ca07f193778Felix Gabriel Mance Left ot -> idToOpSymbol (nameToId n) ot
c92573b85930868b709024284c0f13dbcaec9554Felix Gabriel Mance Right pt -> idToPredSymbol (nameToId n) pt
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance _ -> fail $ concat [ "omdocToSym: only type or object are allowed as"
c92573b85930868b709024284c0f13dbcaec9554Felix Gabriel Mance , " symbol roles, but found: ", show srole ]
c92573b85930868b709024284c0f13dbcaec9554Felix Gabriel ManceomdocToSym _ sym _ = fail $ concat [ "omdocToSym: only TCSymbol is allowed,"
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance , " but found: ", show sym ]
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel ManceomdocToSen :: Env -> TCElement -> String
ae2e84ab0a53874417f01b792cbc6907ee6d09f6Felix Gabriel Mance -> Result (Maybe (Named (FORMULA f)))
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel ManceomdocToSen e (TCSymbol _ t sr _) n =
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance case nameDecode n of
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance return Nothing -- don't translate encoded names here
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance let ns = makeNamed n $ omdocToFormula e t
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance res b = return $ Just $ ns { isAxiom = b }
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance Axiom -> res True
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance Theorem -> res False
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance _ -> return Nothing
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel ManceomdocToSen _ sym _ = fail $ concat [ "omdocToSen: only TCSymbol is allowed,"
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance , " but found: ", show sym ]
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance-- | Sort generation constraints are added as named formulas.
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel ManceaddOMadtToTheory :: Env
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance -> (Sign f e, [Named (FORMULA f)]) -> [[OmdADT]]
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance -> Result (Sign f e, [Named (FORMULA f)])
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel ManceaddOMadtToTheory e (sig, nsens) adts = do
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance sgcs <- mapR (omdocToSortGenConstraint e) adts
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance return (sig, nsens ++ sgcs)
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance-- | The subsort relation is recovered from exported sentences.
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel ManceaddOmdocToTheory :: Env -> (Sign f e, [Named (FORMULA f)]) -> [TCElement]
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel Mance -> Result (Sign f e, [Named (FORMULA f)])
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel ManceaddOmdocToTheory e (sig, nsens) tcs = do
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel Mance srel <- omdocToSortRel e tcs
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel Mance return (sig { sortRel = Rel.transClosure srel }, nsens)
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel Mance-- * Algebraic Data Types
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel ManceomdocToSortGenConstraint :: Env -> [OmdADT] -> Result (Named (FORMULA f))
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel ManceomdocToSortGenConstraint e sortdefs = do
ce5d83770556362fe2c8b567975c2a3758888358Felix Gabriel Mance -- take the last type as the type of all constraints
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance let (t, cs) = mapAccumL (const $ mkConstraint e) Generated sortdefs
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel Mance -- TODO: do we take newSort or origSort?
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance return $ toSortGenNamed (Sort_gen_ax cs $ t == Free) $ map newSort cs
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel MancemkConstraint :: Env -> OmdADT -> (ADTType, Constraint)
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel MancemkConstraint e (ADTSortDef nm t constrs) =
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance let s = lookupSort e $ mkSimpleName nm
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance l = map (mkConstructor e s) constrs
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance in (t, Constraint s l s)
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel MancemkConstraint _ _ = error "mkConstraint: Malformed ADT expression"
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel MancemkConstructor :: Env -> SORT -> OmdADT -> (OP_SYMB, [Int])
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel MancemkConstructor e s (ADTConstr nm args) =
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance let opn = nameToId $ lookupNotation e $ mkSimpleName nm
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance l = map (mkArg e) args
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance in (Qual_op_name opn (Op_type Total l s nullRange) nullRange, [0])
4440f5c4ab1cb6dfd445da97f87a72d87d24c25aFelix Gabriel Mance{- we have to create the name of this injection because we throw it away
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel Manceduring the export -}
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel MancemkConstructor e s (ADTInsort (_, omn)) =
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance let argsort = lookupSort e omn
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance opn = mkUniqueInjName argsort s
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance in (Qual_op_name opn (Op_type Total [argsort] s nullRange) nullRange, [0])
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkConstructor _ _ _ = error "mkConstructor: Malformed ADT expression"
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel MancemkArg :: Env -> OmdADT -> SORT
e615997caa046409fc68114cd72e10a528a4bb71Felix Gabriel MancemkArg e (ADTArg oms _) = lookupSortOMS "mkArg" e oms
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkArg _ _ = error "mkArg: Malformed ADT expression"
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance-- * Subsort Relation
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceomdocToSortRel :: Env -> [TCElement] -> Result (Rel.Rel SORT)
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceomdocToSortRel e = foldM (addMaybeToSortRel e) Rel.empty
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceaddMaybeToSortRel :: Env -> Rel.Rel SORT -> TCElement -> Result (Rel.Rel SORT)
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceaddMaybeToSortRel e r (TCSymbol n (OMA [sof, oms1, oms2]) Axiom _) =
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance case nameDecode n of
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance Just ("ST", _)
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | sof == const_subsortof ->
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance let s1 = lookupSortOMS "addMaybeToSortRel: s1" e oms1
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance s2 = lookupSortOMS "addMaybeToSortRel: s2" e oms2
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance in return $ Rel.insertKeyOrPair s1 s2 r
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | otherwise ->
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance warning () ("Use of subsortof in a non ST Statement: " ++ n)
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceaddMaybeToSortRel _ r _ = return r
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceomdocToType :: Env -> OMElement -> Either OpType PredType
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceomdocToType e (OMA (c : args)) =
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance let sorts = map (lookupSortOMS "omdocToType" e) args
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance opargs = init sorts
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance oprange = last sorts
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance res | c == const_predtype = Right $ PredType sorts
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | c == const_partialfuntype = Left $ OpType Partial opargs oprange
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | c == const_funtype = Left $ OpType Total opargs oprange
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | otherwise = error $ "omdocToType: unknown type constructor: "
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceomdocToType e oms@(OMS _)
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | oms == const_predtype = Right $ PredType []
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance | otherwise = Left $ OpType Total [] $ lookupSortOMS "omdocToType" e oms
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel ManceomdocToType _ ome = error $ "omdocToType: Non-supported element: " ++ show ome
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance-- * Terms and Formulas
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mancetype VarMap = Map.Map VAR SORT
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mancetype TermEnv = (Env, VarMap)
808e2693447ecc5a311a2b9de6b81ca07f193778Felix Gabriel MancemkConjunction, mkDisjunction, mkImplication, mkImplied, mkEquivalence
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel Mance , mkNegation :: [FORMULA f] -> FORMULA f
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkConjunction l = Conjunction l nullRange
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkDisjunction l = Disjunction l nullRange
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkImplication [x, y] = Implication x y True nullRange
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkImplication _ = error "Malformed implication"
fae04f4a69922eb1ddf0f46b34fa15a5a080b693Felix Gabriel MancemkImplied [x, y] = Implication x y False nullRange
acc' = Map.insert v s acc
omdocToFormula e = omdocToFormula' (e, Map.empty)