Logic.hs revision d73a6d88ee6df62ad7c7ed9a8f6e25d20a75b801
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder{-# OPTIONS -fallow-undecidable-instances #-}
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder{- |
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederModule : $Header$
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiDescription : central interface (type class) for logics in Hets
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederCopyright : (c) Till Mossakowski, and Uni Bremen 2002-2006
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederMaintainer : till@tzi.de
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederStability : provisional
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian MaederPortability : non-portable (various -fglasgow-exts extensions)
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederCentral interface (type class) for logics in Hets
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian MaederProvides data structures for logics (with symbols). Logics are
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder a type class with an /identity/ type (usually interpreted
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder by a singleton set) which serves to treat logics as
dc6b48bb46df8e56da3491c98476e6da0d1d5d1dChristian Maeder data. All the functions in the type class take the
da245da15da78363c896e44ea97a14ab1f83eb50Christian Maeder identity as first argument in order to determine the logic.
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder For logic (co)morphisms see "Logic.Comorphism"
4954b30d3c209d7dee4e43016cee8189daf646e8Christian Maeder
dc6b48bb46df8e56da3491c98476e6da0d1d5d1dChristian Maeder This module uses multiparameter type classes
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder (<http://haskell.org/ghc/docs/latest/html/users_guide/type-extensions.html#multi-param-type-classes>)
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder with functional dependencies (<http://haskell.org/hawiki/FunDeps>)
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder for defining an interface for the notion of logic. Multiparameter type
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder classes are needed because a logic consists of a collection of types,
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder together with operations on these. Functional dependencies
c18e9c3c6d5039618f1f2c05526ece84c7794ea3Christian Maeder are needed because no operation will involve all types of
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder the multiparameter type class; hence we need a method to derive
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder the missing types. We chose an easy way: for each logic, we
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder introduce a new singleton type that constitutes the identity
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder of the logic. All other types of the multiparameter type class
f71a8dcf94fd9eb3c9800e16dcdc5e5ff74e5c22Christian Maeder depend on this 'identy constituting' type, and all operations take
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder the 'identity constituting' type as first arguments. The value
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder of the argument of the 'identity constituting' type is irrelevant
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder (note that there is only one value of such a type anyway).
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder References:
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder J. A. Goguen and R. M. Burstall
df638d53c2d5fe5e80b943a58609c8936848ed82Christian Maeder Institutions: Abstract Model Theory for Specification and
df638d53c2d5fe5e80b943a58609c8936848ed82Christian Maeder Programming
23f8d286586ff38a9e73052b2c7c04c62c5c638fChristian Maeder JACM 39, p. 95--146, 1992
23f8d286586ff38a9e73052b2c7c04c62c5c638fChristian Maeder (general notion of logic - model theory only)
df638d53c2d5fe5e80b943a58609c8936848ed82Christian Maeder
23f8d286586ff38a9e73052b2c7c04c62c5c638fChristian Maeder J. Meseguer
23f8d286586ff38a9e73052b2c7c04c62c5c638fChristian Maeder General Logics
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder Logic Colloquium 87, p. 275--329, North Holland, 1989
836e72a3c413366ba9801726f3b249c7791cb9caChristian Maeder (general notion of logic - also entailment/proof theory;
0f894093b1d435fd222074706d7fdadb9725cfdfChristian Maeder notion of logic representation, called map there)
df638d53c2d5fe5e80b943a58609c8936848ed82Christian Maeder
51281dddda866c0cda9fca22bf6bc4eea7128112Christian Maeder T. Mossakowski:
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder Specification in an arbitrary institution with symbols
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder 14th WADT 1999, LNCS 1827, p. 252--270
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder (treatment of symbols and raw symbols, see also CASL semantics
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder in the CASL reference manual)
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder T. Mossakowski, B. Klin:
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder Institution Independent Static Analysis for CASL
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder 15h WADT 2001, LNCS 2267, p. 221-237, 2002.
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder (what is needed for static anaylsis)
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder S. Autexier and T. Mossakowski
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder Integrating HOLCASL into the Development Graph Manager MAYA
cf3232cec840a6945667bdb06f5b47b22243bc8fChristian Maeder FroCoS 2002, LNCS 2309, p. 2-17, 2002.
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder (interface to provers)
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder
f71a8dcf94fd9eb3c9800e16dcdc5e5ff74e5c22Christian Maeder CoFI (ed.): CASL Reference Manual, LNCS 2960, Springer Verlag, 2004.
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder (static semantics of CASL structured and architectural specifications)
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder T. Mossakowski
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder Heterogeneous specification and the heterogeneous tool set
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maeder Habilitation thesis, University of Bremen, 2005
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder (the general picture of heterogeneous specification)
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder-}
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maeder
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maedermodule Logic.Logic where
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maeder
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maederimport Common.Id
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maederimport Common.GlobalAnnotations
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maederimport qualified Common.Lib.Set as Set
76fa667489c5e0868ac68de9f0253ac10f73d0b5Christian Maederimport qualified Common.Lib.Map as Map
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maederimport Common.Lib.Graph as Tree
31242f7541fd6ef179e4eb5be7522ddf54ae397bChristian Maederimport Common.AnnoState
76fa667489c5e0868ac68de9f0253ac10f73d0b5Christian Maederimport Common.Result
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maederimport Common.AS_Annotation
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maederimport Common.Doc
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maederimport Common.DocUtils
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maederimport Logic.Prover -- for one half of class Sentences
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maeder
e8a2ca3a7b3e9a19ef03b6b1c0b5d03dbad6463cChristian Maederimport Common.DynamicUtils
628310b42327ad76ce471caf0dde6563d6fa6307Christian Maederimport Common.ATerm.Lib -- (ShATermConvertible)
ffd01020a4f35f434b912844ad6e0d6918fadffdChristian Maederimport ATC.DefaultMorphism()
ffd01020a4f35f434b912844ad6e0d6918fadffdChristian Maederimport Common.Amalgamate -- passed to ensures_amalgamability
ffd01020a4f35f434b912844ad6e0d6918fadffdChristian Maederimport Common.Taxonomy
fd5d3885a092ac0727fa2436cdfc3b248318ebd8Christian Maederimport Taxonomy.MMiSSOntology (MMiSSOntology)
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder-- | Stability of logic implementations
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederdata Stability = Stable | Testing | Unstable | Experimental
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder deriving (Eq, Show)
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder
ac07a6558423dae7adc488ed9092cd8e9450a29dChristian Maeder-- | shortcut for class constraints
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederclass (Show a, Pretty a, Typeable a, ShATermConvertible a)
ff9a53595208f532c25ac5168f772f48fd80fdb5Christian Maeder => PrintTypeConv a
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder
dc6b48bb46df8e56da3491c98476e6da0d1d5d1dChristian Maeder-- | shortcut for class constraints with equality
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maederclass (Eq a, PrintTypeConv a) => EqPrintTypeConv a
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder
b49276c9f50038e0bd499ad49f7bd6444566a834Christian Maederinstance (Show a, Pretty a, Typeable a,
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder ShATermConvertible a) => PrintTypeConv a
dc6b48bb46df8e56da3491c98476e6da0d1d5d1dChristian Maederinstance (Eq a, PrintTypeConv a) => EqPrintTypeConv a
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder-- | maps from a to a
53301de22afd7190981b363b57c48df86fcb50f7Christian Maedertype EndoMap a = Map.Map a a
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder{- | the name of a logic.
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder Define instances like "data CASL = CASL deriving Show"
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder-}
class Show lid => Language lid where
language_name :: lid -> String
language_name i = show i
description :: lid -> String
-- default implementation
description _ = "No description available"
{- | Categories are given as usual: objects, morphisms, identities,
domain, codomain and composition. The type id is the name, or
the identity of the category. It is an argument to all functions
of the type class, serving disambiguation among instances
(via the functional dependency lid -> sign morphism).
The types for objects and morphisms may be restricted to
subtypes, using legal_obj and legal_mor. For example, for the
category of sets and injective maps, legal_mor would check
injectivity. Since Eq is a subclass of Category, it is also
possible to impose a quotient on the types for objects and morphisms.
-}
class (Language lid, Eq sign, Eq morphism)
=> Category lid sign morphism | lid -> sign morphism where
-- | identity morphisms
ide :: lid -> sign -> morphism
-- | composition, in diagrammatic order
comp :: lid -> morphism -> morphism -> Result morphism
-- | domain and codomain of morphisms
dom, cod :: lid -> morphism -> sign
-- | is a value of type sign denoting a legal signature?
legal_obj :: lid -> sign -> Bool
-- | is a value of type morphism denoting a legal signature morphism?
legal_mor :: lid -> morphism -> Bool
{- | Abstract syntax, parsing and printing.
There are three types for abstract syntax:
basic_spec is for basic specifications (see CASL RefMan p. 5ff.),
symb_items is for symbol lists (see CASL RefMan p. 35ff.),
symb_map_items is for symbol maps (see CASL RefMan p. 35ff.).
-}
class (Language lid, PrintTypeConv basic_spec,
EqPrintTypeConv symb_items,
EqPrintTypeConv symb_map_items)
=> Syntax lid basic_spec symb_items symb_map_items
| lid -> basic_spec symb_items symb_map_items
where
-- | parser for basic specifications
parse_basic_spec :: lid -> Maybe(AParser st basic_spec)
-- | parser for symbol lists
parse_symb_items :: lid -> Maybe(AParser st symb_items)
-- | parser for symbol maps
parse_symb_map_items :: lid -> Maybe(AParser st symb_map_items)
-- default implementations
parse_basic_spec _ = Nothing
parse_symb_items _ = Nothing
parse_symb_map_items _ = Nothing
{- | Sentences, provers and symbols.
Provers capture the entailment relation between sets of sentences
and sentences. They may return proof trees witnessing proofs.
Signatures are equipped with underlying sets of symbols
(such that the category of signatures becomes a concrete category),
see CASL RefMan p. 191ff.
-}
class (Category lid sign morphism, Ord sentence,
Ord symbol, -- for efficient lookup
PrintTypeConv sign, PrintTypeConv morphism,
PrintTypeConv sentence, PrintTypeConv symbol,
Eq proof_tree, Show proof_tree, ShATermConvertible proof_tree,
Ord proof_tree, Typeable proof_tree)
=> Sentences lid sentence proof_tree sign morphism symbol
| lid -> sentence proof_tree sign morphism symbol
where
----------------------- sentences ---------------------------
-- | sentence translation along a signature morphism
map_sen :: lid -> morphism -> sentence -> Result sentence
map_sen l _ _ = statErr l "map_sen"
-- | simplification of sentences (leave out qualifications)
simplify_sen :: lid -> sign -> sentence -> sentence
simplify_sen _ _ = id -- default implementation
-- | parsing of sentences
parse_sentence :: lid -> Maybe (AParser st sentence)
parse_sentence _ = Nothing
-- | print a sentence with comments
print_named :: lid -> Named sentence -> Doc
print_named _ = printAnnoted (addBullet . pretty) . fromLabelledSen
----------------------- symbols ---------------------------
-- | set of symbols for a signature
sym_of :: lid -> sign -> Set.Set symbol
-- | symbol map for a signature morphism
symmap_of :: lid -> morphism -> EndoMap symbol
-- | symbols have a name, see CASL RefMan p. 192
sym_name :: lid -> symbol -> Id
----------------------- provers ---------------------------
-- | several provers can be provided. See module "Logic.Prover"
provers :: lid -> [Prover sign sentence proof_tree]
provers _ = [] -- default implementation
-- | consistency checkers
cons_checkers :: lid -> [ConsChecker sign sentence morphism proof_tree]
cons_checkers _ = [] -- default implementation
-- | conservativity checkers
conservativityCheck :: lid -> (sign, [Named sentence]) ->
morphism -> [Named sentence] -> Result (Maybe Bool)
conservativityCheck l _ _ _ = statErr l "conservativityCheck"
-- | the empty proof tree
empty_proof_tree :: proof_tree
-- | a dummy static analysis function to allow type checking *.inline.hs files
inlineAxioms :: StaticAnalysis lid
basic_spec sentence proof_tree symb_items symb_map_items
sign morphism symbol raw_symbol => lid -> String -> [Named sentence]
inlineAxioms _ _ = error "inlineAxioms"
-- error function for static analysis
statErr :: (Language lid, Monad m) => lid -> String -> m a
statErr lid str = fail ("Logic." ++ str ++ " nyi for: " ++ language_name lid)
{- static analysis
This type class provides the data needed for an institution with symbols,
as explained in the structured specification semantics in the CASL
reference manual, chapter III.4.
The static analysis computes signatures from basic specifications,
and signature morphisms from symbol lists and symbol maps. The latter
needs an intermediate stage, so-called raw symbols, which are possibly
unqualified symbols. Normal symbols are always fully qualified.
In the CASL reference manual, our symbols are called "signature symbols",
and our raw symbols are called "symbols". (Terminology should be adapted.)
-}
class ( Syntax lid basic_spec symb_items symb_map_items
, Sentences lid sentence proof_tree sign morphism symbol
, Ord raw_symbol, Pretty raw_symbol, Typeable raw_symbol)
=> StaticAnalysis lid
basic_spec sentence proof_tree symb_items symb_map_items
sign morphism symbol raw_symbol
| lid -> basic_spec sentence proof_tree symb_items symb_map_items
sign morphism symbol raw_symbol
where
----------------------- static analysis ---------------------------
{- | static analysis of basic specifications and symbol maps.
The resulting bspec has analyzed axioms in it.
The resulting sign is an extension of the input sign.
See CASL RefMan p. 138 ff. -}
basic_analysis :: lid ->
Maybe((basic_spec, -- abstract syntax tree
sign, -- input signature, for the local
-- environment, carrying the previously
-- declared symbols
GlobalAnnos) -> -- global annotations
Result (basic_spec, sign, [Named sentence]))
-- default implementation
basic_analysis _ = Nothing
-- | one-sided inverse for static analysis
sign_to_basic_spec :: lid -> sign -> [Named sentence] -> basic_spec
-- | static analysis of symbol maps, see CASL RefMan p. 222f.
stat_symb_map_items ::
lid -> [symb_map_items] -> Result (EndoMap raw_symbol)
stat_symb_map_items l _ = statErr l "stat_symb_map_items"
-- | static analysis of symbol lists, see CASL RefMan p. 221f.
stat_symb_items :: lid -> [symb_items] -> Result [raw_symbol]
stat_symb_items l _ = statErr l "stat_symb_items"
------------------------- amalgamation ---------------------------
{- | Computation of colimits of signature diagram.
Indeed, it suffices to compute a coconce that is weakly amalgamable
see Till Mossakowski,
Heterogeneous specification and the heterogeneous tool set
p. 25ff. -}
weaklyAmalgamableCocone :: lid -> Tree.Gr sign morphism
-> Result (sign, Map.Map Int morphism)
weaklyAmalgamableCocone l _ = statErr l "weaklyAmalgamableCocone"
-- | architectural sharing analysis, see CASL RefMan p. 247ff.
ensures_amalgamability :: lid ->
([CASLAmalgOpt], -- the program options
Tree.Gr sign morphism, -- the diagram to be analyzed
[(Int, morphism)], -- the sink
Tree.Gr String String) -- the descriptions of nodes and edges
-> Result Amalgamates
ensures_amalgamability l _ = statErr l "ensures_amalgamability"
-------------------- symbols and raw symbols ---------------------
{- | Construe a symbol, like f:->t, as a raw symbol.
This is a one-sided inverse to the function SymSySigSym
in the CASL RefMan p. 192. -}
symbol_to_raw :: lid -> symbol -> raw_symbol
{- | Construe an identifier, like f, as a raw symbol.
See CASL RefMan p. 192, function IDAsSym -}
id_to_raw :: lid -> Id -> raw_symbol
{- | Check wether a symbol matches a raw symbol, for
example, f:s->t matches f. See CASL RefMan p. 192 -}
matches :: lid -> symbol -> raw_symbol -> Bool
--------------- operations on signatures and morphisms -----------
-- | the empty (initial) signature, see CASL RefMan p. 193
empty_signature :: lid -> sign
-- | union of signatures, see CASL RefMan p. 193
signature_union :: lid -> sign -> sign -> Result sign
signature_union l _ _ = statErr l "signature_union"
{- | Compute the difference of signatures. The first
signature must be an inclusion of the second. The resulting
signature might be an unclosed signature that should only be
used with care, though the following property should hold:
is_subsig s1 s2 => union s1 (difference s2 s1) = s2
(Unions are supposed to be symmetric and associative.) -}
signature_difference :: lid -> sign -> sign -> Result sign
signature_difference l _ _ = statErr l "signature_difference"
-- | subsignatures, see CASL RefMan p. 194
is_subsig :: lid -> sign -> sign -> Bool
-- | final union of signatures, see CASL RefMan p. 194
final_union :: lid -> sign -> sign -> Result sign
final_union l _ _ = statErr l "final_union"
-- | union of signature morphims, see CASL RefMan p. 196
morphism_union :: lid -> morphism -> morphism -> Result morphism
morphism_union l _ _ = statErr l "morphism_union"
{- | construct the inclusion morphisms between subsignatures,
see CASL RefMan p. 194 -}
inclusion :: lid -> sign -> sign -> Result morphism
inclusion l _ _ = statErr l "inclusion"
{- | the signature (co)generated by a set of symbols in another
signature is the smallest (largest) signature containing
(excluding) the set of symbols. Needed for revealing and
hiding, see CASL RefMan p. 197ff. -}
generated_sign, cogenerated_sign ::
lid -> Set.Set symbol -> sign -> Result morphism
generated_sign l _ _ = statErr l "generated_sign"
cogenerated_sign l _ _ = statErr l "cogenerated_sign"
{- | Induce a signature morphism from a source signature and
a raw symbol map. Needed for translation (SP with SM).
See CASL RefMan p. 198 -}
induced_from_morphism ::
lid -> EndoMap raw_symbol -> sign -> Result morphism
induced_from_morphism l _ _ = statErr l "induced_from_morphism"
{- | Induce a signature morphism between two signatures by a
raw symbol map. Needed for instantiation and views.
See CASL RefMan p. 198f. -}
induced_from_to_morphism ::
lid -> EndoMap raw_symbol -> sign -> sign -> Result morphism
induced_from_to_morphism l _ _ _ =
statErr l "induced_from_to_morphism"
{- | Check whether a signature morphism is transportable.
See CASL RefMan p. 304f. -}
is_transportable :: lid -> morphism -> Bool
is_transportable _ _ = False -- safe default
{- | Check whether the underlying symbol map of a signature morphism
is injective -}
is_injective :: lid -> morphism -> Bool
is_injective _ _ = False -- safe default
------------------- generate taxonomy from theory ----------------
-- | generate an ontological taxonomy, if this makes sense
theory_to_taxonomy :: lid
-> TaxoGraphKind
-> MMiSSOntology
-> sign -> [Named sentence]
-> Result MMiSSOntology
theory_to_taxonomy l _ _ _ _ = statErr l "theory_to_taxonomy"
-- | semi lattices with top (needed for sublogics)
class (Eq l, Show l) => SemiLatticeWithTop l where
join :: l -> l -> l
top :: l
instance SemiLatticeWithTop () where
join _ _ = ()
top = ()
-- | less or equal for semi lattices
isSubElem :: SemiLatticeWithTop l => l -> l -> Bool
isSubElem a b = join a b == b
-- | class providing the minimal sublogic of an item
class MinSublogic sublogic item where
minSublogic :: item -> sublogic
-- | a default instance for no sublogics
instance MinSublogic () a where
minSublogic _ = ()
{-
instance SemiLatticeWithTop s => MinSublogic s a where
minSublogic _ = top
-}
-- | class providing also the projection of an item to a sublogic
class MinSublogic sublogic item => ProjectSublogic sublogic item where
projectSublogic :: sublogic -> item -> item
-- | a default instance for no sublogics
instance ProjectSublogic () b where
projectSublogic _ = id
{-
instance MinSublogic a b => ProjectSublogic a b where
projectSublogic _ = id
-}
-- | like ProjectSublogic, but providing a partial projection
class MinSublogic sublogic item => ProjectSublogicM sublogic item where
projectSublogicM :: sublogic -> item -> Maybe item
-- | a default instance for no sublogics
instance ProjectSublogicM () b where
projectSublogicM _ = Just
{-
instance (SemiLatticeWithTop a, MinSublogic a b) => ProjectSublogicM a b where
projectSublogicM l i = if isSubElem (minSublogic i) l
then Just i else Nothing
-}
-- | class for providing a list of sublogic names
class Sublogics l where
sublogic_names :: l -> [String]
instance Sublogics () where
sublogic_names () = [""]
{- Type class logic. The central type class of Hets, providing the
interface for logics. This type class is instantiated for many logics,
and it is used for the logic independent parts of Hets.
It hence provides an sbatraction barrier between logic specific and
logic indepdendent code.
This type class extends the class StaticAnalysis by a sublogic mechanism.
Sublogics are important since they avoid the need to provide an own
instance of the class logic for each sublogic. Instead, the sublogic
can use the datastructures and operations of the main logic, and
functions are provided to test whether a given item lies within the
sublogic. Also, projection functions from a super-logic to a sublogic
are provided.
-}
class (StaticAnalysis lid
basic_spec sentence proof_tree symb_items symb_map_items
sign morphism symbol raw_symbol,
SemiLatticeWithTop sublogics,
MinSublogic sublogics sentence,
ProjectSublogic sublogics basic_spec,
ProjectSublogicM sublogics symb_items,
ProjectSublogicM sublogics symb_map_items,
ProjectSublogic sublogics sign,
ProjectSublogic sublogics morphism,
ProjectSublogicM sublogics symbol,
Typeable sublogics,
ShATermConvertible sublogics,
Sublogics sublogics)
=> Logic lid sublogics
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol proof_tree
| lid -> sublogics
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol proof_tree
where
-- | stability of the implementation
stability :: lid -> Stability
-- default
stability _ = Experimental
-- | for a process logic, return its data logic
data_logic :: lid -> Maybe AnyLogic
data_logic _ = Nothing
-- | the top sublogic, corresponding to the whole logic
top_sublogic :: lid -> sublogics
top_sublogic _ = top
-- | list all the sublogics of the current logic
all_sublogics :: lid -> [sublogics]
all_sublogics li = [top_sublogic li]
{- | provide the embedding of a projected signature into the
original signature -}
proj_sublogic_epsilon :: lid -> sublogics -> sign -> morphism
proj_sublogic_epsilon li _ s = ide li s
----------------------------------------------------------------
-- Derived functions
----------------------------------------------------------------
-- | the empty theory
empty_theory :: StaticAnalysis lid
basic_spec sentence proof_tree symb_items symb_map_items
sign morphism symbol raw_symbol =>
lid -> Theory sign sentence proof_tree
empty_theory lid = Theory (empty_signature lid) Map.empty
----------------------------------------------------------------
-- Existential type covering any logic
----------------------------------------------------------------
-- | the disjoint union of all logics
data AnyLogic = forall lid sublogics
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol proof_tree .
Logic lid sublogics
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol proof_tree =>
Logic lid
instance Show AnyLogic where
show (Logic lid) = language_name lid
instance Eq AnyLogic where
Logic lid1 == Logic lid2 = language_name lid1 == language_name lid2
tyconAnyLogic :: TyCon
tyconAnyLogic = mkTyCon "Logic.Logic.AnyLogic"
instance Typeable AnyLogic where
typeOf _ = mkTyConApp tyconAnyLogic []
{- class hierarchy:
Language
__________/
Category
| /
Sentences Syntax
\ /
StaticAnalysis (no sublogics)
\
\
Logic
-}