Logic.hs revision 411588cc915b27cef4e7e66fb23e67514b3a0c92
2b873214c9ab511bbca437c036371ab664aedaceChristian Maeder{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveDataTypeable
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maeder , FlexibleInstances, UndecidableInstances, ExistentialQuantification #-}
c63ebf815c8a874525cf18670ad74847f7fc7b26Christian Maeder{- |
c092fcac4b8f5c524c22ca579189c4487c13edf7Christian MaederModule : $Header$
54ed6a6b1a6c7d27fadb39ec5b59d0806c81f7c8Christian MaederDescription : central interface (type class) for logics in Hets
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiCopyright : (c) Till Mossakowski, and Uni Bremen 2002-2006
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederLicense : GPLv2 or higher, see LICENSE.txt
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiMaintainer : till@informatik.uni-bremen.de
75a6279dbae159d018ef812185416cf6df386c10Till MossakowskiStability : provisional
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian MaederPortability : non-portable (various -fglasgow-exts extensions)
c092fcac4b8f5c524c22ca579189c4487c13edf7Christian Maeder
dda5ab793f1615c1ba1dcaa97a4346b0878da6b1Christian MaederCentral interface (type class) for logics in Hets
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maeder
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian MaederProvides data structures for logics (with symbols). Logics are
da955132262baab309a50fdffe228c9efe68251dCui Jian a type class with an /identity type/ (usually interpreted
dda5ab793f1615c1ba1dcaa97a4346b0878da6b1Christian Maeder by a singleton set) which serves to treat logics as
dda5ab793f1615c1ba1dcaa97a4346b0878da6b1Christian Maeder data. All the functions in the type class take the
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maeder identity as first argument in order to determine the logic.
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maeder
0799b5dc3f06d2640e66e9ab54b8b217348fd719Christian Maeder For logic (co)morphisms see "Logic.Comorphism"
0799b5dc3f06d2640e66e9ab54b8b217348fd719Christian Maeder
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder This module uses multiparameter type classes with functional dependencies
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder (<http://www.haskell.org/haskellwiki/Functional_dependencies>)
43b4c41fbb07705c9df321221ab9cb9832460407Christian Maeder for defining an interface for the notion of logic. Multiparameter type
4c8d3c5a9e938633f6147b5a595b9b93bfca99e6Christian Maeder classes are needed because a logic consists of a collection of types,
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian Maeder together with operations on these. Functional dependencies
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian Maeder are needed because no operation will involve all types of
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian Maeder the multiparameter type class; hence we need a method to derive
14c89b2d830777bf4db2850f038c9f60acaca486Christian Maeder the missing types. We chose an easy way: for each logic, we
b10d6cef708b7a659f2d3b367e8e0db0d03ae3f5Till Mossakowski introduce a new singleton type that is the name, or constitutes the identity
f77f29e84b3f6e791c82e61b13fbf76582bedd2fChristian Maeder of the logic. All other types of the multiparameter type class
dda5ab793f1615c1ba1dcaa97a4346b0878da6b1Christian Maeder depend on this /identity constituting/ type, and all operations take
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder the 'identity constituting' type as first arguments. The value
f77f29e84b3f6e791c82e61b13fbf76582bedd2fChristian Maeder of the argument of the /identity constituting/ type is irrelevant
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maeder (note that there is only one value of such a type anyway).
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder
da333ffa6336cf59a4071fcddad358c5eafd3e61Sonja Gröning Note that we tend to use @lid@ both for the /identity type/
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder of a logic, as well as for its unique inhabitant, i.e. @lid :: lid@.
6352f3c31da3043783a13be6594aacb2147378baRazvan Pascanu
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross The other types involved in the definition of logic are as follows:
fc1a590cd3ee36797c0a032ff41e07f8e2469341Christian Maeder
a2b04db3e156312a8596d8084f7f0f51acf8a96bChristian Maeder * sign: signatures, that is, contexts, or non-logical vocabularies,
0c885f1348fd58f7cb706472a3ff20b52dbef0a7Jonathan von Schroeder typically consisting of a set of declared sorts, predicates,
fc1a590cd3ee36797c0a032ff41e07f8e2469341Christian Maeder function symbols, propositional letters etc., together with their
66a774f13272fde036481edd2298081ab3d04678Razvan Pascanu typing.
834c2e71b8e390e5b05c8d02bb6eb22621125133Markus Gross
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder * sentence: logical formulas.
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder * basic_spec: abstract syntax of basic specifications. The latter are
6e52f1dfc0da4bc4a7701cf856641c9dce08fc7dChristian Maeder human-readable presentations of a signature together with some sentences.
923e25bb8c7cf9f2978c7844ad173704482cc3b0Martin Kühl
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakova * symbol: symbols that may occur in a signature, fully qualified
63da71bfb4226f504944b293fb77177ebcaea7d4Ewaryst Schulz with their types
e1ea9a046e9640148ca876dfe47e391559a9fdf3Christian Maeder
14c89b2d830777bf4db2850f038c9f60acaca486Christian Maeder * raw_symbol: symbols that may occur in a signature, possibly not
57026bc09337d158b89775048a9bcc9c17d825caChristian Maeder or partially qualified
57026bc09337d158b89775048a9bcc9c17d825caChristian Maeder
57026bc09337d158b89775048a9bcc9c17d825caChristian Maeder * morphism: maps between signatures (typically preserving the structure).
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder
e1ea9a046e9640148ca876dfe47e391559a9fdf3Christian Maeder * symb_items: abstract syntax of symbol lists, used for declaring some
923e25bb8c7cf9f2978c7844ad173704482cc3b0Martin Kühl symbols of a signature as hidden.
f66fcd981f556c238df7dd6dfa42123745e3b1d2Christian Maeder
2b873214c9ab511bbca437c036371ab664aedaceChristian Maeder * symb_map_items: abstract syntax of symbol maps, i.e. human-readable
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder presentations of signature morphisms.
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder * sublogics: sublogics of the given logic. This type might be a
d27b1887e61f1dc53d77c37f59dbf5019242a686Christian Maeder record of Boolean flags, indicating whether some feature is
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder present in the sublogi of not.
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross * proof_tree: proof trees.
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder References:
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder J. A. Goguen and R. M. Burstall
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder Institutions: Abstract Model Theory for Specification and
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder Programming
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder JACM 39, p. 95-146, 1992
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder (general notion of logic - model theory only)
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder J. Meseguer
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder General Logics
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder Logic Colloquium 87, p. 275-329, North Holland, 1989
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder (general notion of logic - also proof theory;
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder notion of logic representation, called map there)
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder T. Mossakowski:
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder Specification in an arbitrary institution with symbols
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder 14th WADT 1999, LNCS 1827, p. 252-270
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder (treatment of symbols and raw symbols, see also CASL semantics
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin Kühl in the CASL reference manual)
ee1c7c5796832536932d7b06cbfb1ca13f9a0d7bMartin Kühl
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder T. Mossakowski, B. Klin:
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder Institution Independent Static Analysis for CASL
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder 15h WADT 2001, LNCS 2267, p. 221-237, 2002.
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder (what is needed for static anaylsis)
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder
bdc103981a28a51938de98a956d8a3767f6cf43dAivaras Jakubauskas S. Autexier and T. Mossakowski
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder Integrating HOLCASL into the Development Graph Manager MAYA
e1ea9a046e9640148ca876dfe47e391559a9fdf3Christian Maeder FroCoS 2002, LNCS 2309, p. 2-17, 2002.
e1ea9a046e9640148ca876dfe47e391559a9fdf3Christian Maeder (interface to provers)
57026bc09337d158b89775048a9bcc9c17d825caChristian Maeder
57026bc09337d158b89775048a9bcc9c17d825caChristian Maeder CoFI (ed.): CASL Reference Manual, LNCS 2960, Springer Verlag, 2004.
22b772f8753f0cdb4508ba460356c238de2ee375Jonathan von Schroeder (static semantics of CASL structured and architectural specifications)
7bbfb15142ab4286dfc6fcde2fc94a5512297e41Jonathan von Schroeder
fa388aea9cef5f9734fec346159899a74432ce26Christian Maeder T. Mossakowski
63719301448519453f66383f4e583d9fd5b89ecbChristian Maeder Heterogeneous specification and the heterogeneous tool set
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maeder Habilitation thesis, University of Bremen, 2005
0c885f1348fd58f7cb706472a3ff20b52dbef0a7Jonathan von Schroeder (the general picture of heterogeneous specification)
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder-}
52d922076b89f12234f721974e82531bc69a6f69Christian Maeder
923e25bb8c7cf9f2978c7844ad173704482cc3b0Martin Kühlmodule Logic.Logic where
9f85afecbd79b3df5a0bb17bd28cd0b288dc3213Kristina Sojakova
72079df98b3cb7cc1fd82a0a24984893dcd05ecaEwaryst Schulzimport Logic.Prover (Prover, ConsChecker, Theory (..))
a461314c811f4187dff85c8be079a41b2f13f176Christian Maeder
a3a7d8b3cdf05c8040c62dbcf9a15dc5042cd721Christian Maederimport Taxonomy.MMiSSOntology (MMiSSOntology)
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian Maeder
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maederimport ATC.DefaultMorphism ()
8a77240a809197c92c0736c431b4b88947a7bac1Christian Maeder
fbc4f8708092d571a45cb483f37cc6b674da45a7Christian Maederimport qualified OMDoc.DataTypes as OMDoc
bb63f684c4f5f33ffcd1dcc02c58d6a703900fafJonathan von Schroeder ( TCElement
b0234f0a84fcd3587073fbc11d38759108997c3cChristian Maeder , TCorOMElement
b0234f0a84fcd3587073fbc11d38759108997c3cChristian Maeder , NameMap
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross , SigMap
8ef91a173e69219fc2ebd45c76a35891c7785abdMarkus Gross , SigMapI
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyer , OMCD
d56ece59c372cb887355825901222b9f3377f7e6Thiemo Wiedemeyer , OmdADT)
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder
9175e29c044318498a40f323f189f9dfd50378efChristian Maederimport ATerm.Lib (ShATermConvertible)
9175e29c044318498a40f323f189f9dfd50378efChristian Maeder
f1dec6898638ba1131a9fadbc4d1544c93dfabb0Klaus Luettichimport Common.AS_Annotation
9175e29c044318498a40f323f189f9dfd50378efChristian Maederimport Common.Amalgamate
f77f29e84b3f6e791c82e61b13fbf76582bedd2fChristian Maederimport Common.AnnoState
import Common.Consistency
import Common.DefaultMorphism
import Common.Doc
import Common.DocUtils
import Common.ExtSign
import Common.GlobalAnnotations
import Common.Id
import Common.IRI
import Common.Item
import Common.Lib.Graph
import Common.LibName
import Common.Prec (PrecMap)
import Common.Result
import Common.Taxonomy
import qualified Data.Set as Set
import qualified Data.Map as Map
import Data.Ord
import Data.Typeable
import Control.Monad (unless, mplus)
-- | Stability of logic implementations
data Stability = Stable | Testing | Unstable | Experimental
deriving (Eq, Show)
-- | shortcut for class constraints
class ShATermConvertible a => Convertible a
instance ShATermConvertible a => Convertible a
-- | shortcut for class constraints
class (Pretty a, Convertible a) => PrintTypeConv a
instance (Pretty a, Convertible a) => PrintTypeConv a
-- | shortcut for class constraints with equality
class (Eq a, PrintTypeConv a) => EqPrintTypeConv a
instance (Eq a, PrintTypeConv a) => EqPrintTypeConv a
-- | maps from a to a
type EndoMap a = Map.Map a a
{- | the name of a logic.
Define instances like "data CASL = CASL deriving Show"
-}
class Show lid => Language lid where
language_name :: lid -> String
language_name = show
description :: lid -> String
-- default implementation
description _ = ""
{- | 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 -> object 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.
Require Ord instances only for efficiency, i.e. in sets or maps.
-}
class (Ord object, Ord morphism)
=> Category object morphism | morphism -> object where
-- | identity morphisms
ide :: object -> morphism
{- | composition, in diagrammatic order,
if intermediate objects are equal (not checked!) -}
composeMorphisms :: morphism -> morphism -> Result morphism
-- | domain and codomain of morphisms
dom, cod :: morphism -> object
-- | the inverse of a morphism
inverse :: morphism -> Result morphism
inverse _ = fail "Logic.Logic.Category.inverse not implemented"
-- | test if the signature morphism an inclusion
isInclusion :: morphism -> Bool
isInclusion _ = False -- in general no inclusion
-- | is a value of type morphism denoting a legal morphism?
legal_mor :: morphism -> Result ()
legal_mor _ = return ()
-- | test if the signature morphism is the identity
isIdentity :: Category object morphism => morphism -> Bool
isIdentity m = isInclusion m && dom m == cod m
comp :: Category object morphism => morphism -> morphism -> Result morphism
comp m1 m2 = if cod m1 == dom m2 then composeMorphisms m1 m2 else
fail "target of first and source of second morphism are different"
instance Ord sign => Category sign (DefaultMorphism sign) where
dom = domOfDefaultMorphism
cod = codOfDefaultMorphism
ide = ideOfDefaultMorphism
isInclusion = const True
composeMorphisms = compOfDefaultMorphism
{- | 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, GetRange 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
-- | parsers and printers
parsersAndPrinters :: lid -> Map.Map IRI
(AParser st basic_spec, basic_spec -> Doc)
parsersAndPrinters li = case parse_basic_spec li of
Nothing -> Map.empty
Just p -> makeDefault (p, pretty)
-- | 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)
toItem :: lid -> basic_spec -> Item
-- default implementations
parse_basic_spec _ = Nothing
parse_symb_items _ = Nothing
parse_symb_map_items _ = Nothing
toItem _ bs = mkFlatItem ("Basicspec", pretty bs) $ getRangeSpan bs
basicSpecParser :: Syntax lid basic_spec symb_items symb_map_items
=> Maybe IRI -> lid -> Maybe (AParser st basic_spec)
basicSpecParser sm = fmap fst . parserAndPrinter sm
basicSpecPrinter :: Syntax lid basic_spec symb_items symb_map_items
=> Maybe IRI -> lid -> Maybe (basic_spec -> Doc)
basicSpecPrinter sm = fmap snd . parserAndPrinter sm
parserAndPrinter :: Syntax lid basic_spec symb_items symb_map_items
=> Maybe IRI -> lid -> Maybe (AParser st basic_spec, basic_spec -> Doc)
parserAndPrinter sm = lookupDefault sm . parsersAndPrinters
-- | function to lookup parser or printer
lookupDefault :: Maybe IRI -> Map.Map IRI b -> Maybe b
lookupDefault sm m = if Map.size m == 1 then Just $ head $ Map.elems m else
let mr = Map.lookup nullIRI m
in case sm of
Just s -> mplus (Map.lookup s m) mr
Nothing -> mr
showSyntax :: Language lid => lid -> Maybe IRI -> String
showSyntax lid = (("logic " ++ language_name lid) ++)
. maybe "" ((" serialization " ++) . iriToStringUnsecure)
makeDefault :: b -> Map.Map IRI b
makeDefault = Map.singleton nullIRI
addSyntax :: String -> b -> Map.Map IRI b -> Map.Map IRI b
addSyntax = Map.insert . simpleIdToIRI . mkSimpleId
{- | 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 (Language lid, Category sign morphism, Ord sentence,
Ord symbol, -- for efficient lookup
PrintTypeConv sign, PrintTypeConv morphism,
GetRange sentence, GetRange symbol,
PrintTypeConv sentence, PrintTypeConv symbol)
=> Sentences lid sentence sign morphism symbol
| lid -> sentence sign morphism symbol
where
-- | sentence translation along a signature morphism
map_sen :: lid -> morphism -> sentence -> Result sentence
map_sen l _ _ = statFail l "map_sen"
-- | simplification of sentences (leave out qualifications)
simplify_sen :: lid -> sign -> sentence -> sentence
simplify_sen _ _ = id
-- | negation of a sentence for disproving
negation :: lid -> sentence -> Maybe sentence
negation _ _ = Nothing
-- | modified signature printing when followed by sentences
print_sign :: lid -> sign -> Doc
print_sign _ = pretty
-- | print a sentence with comments
print_named :: lid -> Named sentence -> Doc
print_named _ = printAnnoted (addBullet . pretty) . fromLabelledSen
-- --------------------- symbols ---------------------------
-- | dependency ordered list of symbol sets for a signature
sym_of :: lid -> sign -> [Set.Set symbol]
sym_of _ _ = []
{- | Dependency ordered list of a bigger symbol set for a
signature. This function contains more symbols than those being subject
to hiding and renaming (given by 'sym_of') to better represent a
signature as a set of symbols given within xml files. At least for CASL
additional symbols for (direct) subsorts will be created, but note, that
no symbol for a partial function will be created, if the signature
contains this function as total, although a signature with just that
partial function would be a subsignature. This function is supposed to
work over partial signatures created by 'signatureDiff'. -}
mostSymsOf :: lid -> sign -> [symbol]
mostSymsOf l = concatMap Set.toList . sym_of l
-- | symbol map for a signature morphism
symmap_of :: lid -> morphism -> EndoMap symbol
symmap_of _ _ = Map.empty
-- | symbols have a name, see CASL RefMan p. 192
sym_name :: lid -> symbol -> Id
sym_name l _ = statError l "sym_name"
-- | a logic dependent kind of a symbol
symKind :: lid -> symbol -> String
symKind _ _ = ""
-- | the symbols occuring in a sentence (any order)
symsOfSen :: lid -> sentence -> [symbol]
symsOfSen _ _ = []
-- | makes a singleton list from the given value
singletonList :: a -> [a]
singletonList x = [x]
-- | set of symbols for a signature
symset_of :: forall lid sentence sign morphism symbol .
Sentences lid sentence sign morphism symbol =>
lid -> sign -> Set.Set symbol
symset_of lid sig = Set.unions $ sym_of lid sig
-- | dependency ordered list of symbols for a signature
symlist_of :: forall lid sentence sign morphism symbol .
Sentences lid sentence sign morphism symbol =>
lid -> sign -> [symbol]
symlist_of lid sig = concatMap Set.toList $ sym_of lid sig
-- | a dummy static analysis function to allow type checking *.inline.hs files
inlineAxioms :: StaticAnalysis lid
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol => lid -> String -> [Named sentence]
inlineAxioms _ _ = error "inlineAxioms"
-- | fail function for static analysis
statFail :: (Language lid, Monad m) => lid -> String -> m a
statFail lid = fail . statErrMsg lid
statError :: Language lid => lid -> String -> a
statError lid = error . statErrMsg lid
-- | error message for static analysis
statErrMsg :: Language lid => lid -> String -> String
statErrMsg lid str =
"Logic." ++ str ++ " not implemented 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 sign morphism symbol
, GetRange raw_symbol, Ord raw_symbol, Pretty raw_symbol
, Typeable raw_symbol)
=> StaticAnalysis lid
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol
| lid -> basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol
where
{- | 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
plus newly declared or redeclared symbols.
See CASL RefMan p. 138 ff. -}
basic_analysis :: lid
-> Maybe ((basic_spec, sign, GlobalAnnos)
-> Result (basic_spec, ExtSign sign symbol, [Named sentence]))
basic_analysis _ = Nothing
-- | a basic analysis with additional arguments
extBasicAnalysis :: lid -> IRI -> LibId
-> basic_spec -> sign -> GlobalAnnos
-> Result (basic_spec, ExtSign sign symbol, [Named sentence])
extBasicAnalysis l _ _ b s g = case basic_analysis l of
Nothing -> statFail l "basic_analysis"
Just ba -> ba (b, s, g)
-- | static analysis of symbol maps, see CASL RefMan p. 222f.
stat_symb_map_items :: lid -> sign -> Maybe sign -> [symb_map_items]
-> Result (EndoMap raw_symbol)
stat_symb_map_items l _ _ _ = statFail l "stat_symb_map_items"
-- | static analysis of symbol lists, see CASL RefMan p. 221f.
stat_symb_items :: lid -> sign -> [symb_items] -> Result [raw_symbol]
stat_symb_items l _ _ = statFail l "stat_symb_items"
-- | convert a theory to basic specs for different serializations
convertTheory :: lid -> Maybe ((sign, [Named sentence]) -> basic_spec)
convertTheory _ = Nothing
{- ----------------------- amalgamation ---------------------------
Computation of colimits of signature diagram.
Indeed, it suffices to compute a cocone that is weakly amalgamable
see Till Mossakowski,
Heterogeneous specification and the heterogeneous tool set
p. 25ff. -}
-- | architectural sharing analysis, see CASL RefMan p. 247ff.
ensures_amalgamability :: lid ->
([CASLAmalgOpt], -- the program options
Gr sign (Int, morphism), -- the diagram to be analyzed
[(Int, morphism)], -- the sink
Gr String String) -- the descriptions of nodes and edges
-> Result Amalgamates
ensures_amalgamability l _ = warning Amalgamates
("amalgamability test not implemented for logic " ++ show l)
nullRange
-- | quotient term algebra for normalization of freeness
quotient_term_algebra :: lid -- the logic
-> morphism -- sigma : Sigma -> SigmaM
-> [Named sentence] -- Th(M)
-> Result
(sign, -- SigmaK
[Named sentence] -- Ax(K)
)
quotient_term_algebra l _ _ = statFail l "quotient_term_algebra"
-- | signature colimits
signature_colimit :: lid -> Gr sign (Int, morphism)
-> Result (sign, Map.Map Int morphism)
signature_colimit l _ = statFail l "signature_colimit"
{- | rename and qualify the symbols considering a united incoming
morphisms, code out overloading and
create sentences for the overloading relation -}
qualify :: lid -> SIMPLE_ID -> LibId -> morphism -> sign
-> Result (morphism, [Named sentence])
qualify l _ _ _ _ = statFail l "qualify"
-- ------------------ 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
symbol_to_raw l _ = statError l "symbol_to_raw"
{- | Construe an identifier, like f, as a raw symbol.
See CASL RefMan p. 192, function IDAsSym -}
id_to_raw :: lid -> Id -> raw_symbol
id_to_raw l _ = statError l "id_to_raw"
{- | 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
matches _ _ _ = True
-- ------------- operations on signatures and morphisms -----------
-- | the empty (initial) signature, see CASL RefMan p. 193
empty_signature :: lid -> sign
-- | adds a symbol to a given signature
add_symb_to_sign :: lid -> sign -> symbol -> Result sign
add_symb_to_sign l _ _ = statFail l "add_symb_to_sign"
-- | union of signatures, see CASL RefMan p. 193
signature_union :: lid -> sign -> sign -> Result sign
signature_union l _ _ = statFail l "signature_union"
-- | difference of signatures resulting in unclosed pre-signatures
signatureDiff :: lid -> sign -> sign -> Result sign
signatureDiff l _ _ = statFail l "signatureDiff"
-- | intersection of signatures
intersection :: lid -> sign -> sign -> Result sign
intersection l _ _ = statFail l "intersection"
-- | final union of signatures, see CASL RefMan p. 194
final_union :: lid -> sign -> sign -> Result sign
final_union l _ _ = statFail l "final_union"
-- | union of signature morphims, see CASL RefMan p. 196
morphism_union :: lid -> morphism -> morphism -> Result morphism
morphism_union l _ _ = statFail l "morphism_union"
-- | subsignatures, see CASL RefMan p. 194
is_subsig :: lid -> sign -> sign -> Bool
is_subsig _ _ _ = False
{- | construct the inclusion morphisms between subsignatures,
see CASL RefMan p. 194 -}
subsig_inclusion :: lid -> sign -> sign -> Result morphism
subsig_inclusion l _ _ = statFail l "subsig_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 _ _ = statFail l "generated_sign"
cogenerated_sign l _ _ = statFail 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 _ _ = statFail 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 -> ExtSign sign symbol
-> ExtSign sign symbol -> Result morphism
induced_from_to_morphism l rm (ExtSign sig _) (ExtSign tar _) = do
mor <- induced_from_morphism l rm sig
inclusion l (cod mor) tar >>= composeMorphisms mor
{- | Check whether a signature morphism is transportable.
See CASL RefMan p. 304f. -}
is_transportable :: lid -> morphism -> Bool
is_transportable _ _ = False
{- | Check whether the underlying symbol map of a signature morphism
is injective -}
is_injective :: lid -> morphism -> Bool
is_injective _ _ = False
-- | generate an ontological taxonomy, if this makes sense
theory_to_taxonomy :: lid
-> TaxoGraphKind
-> MMiSSOntology
-> sign -> [Named sentence]
-> Result MMiSSOntology
theory_to_taxonomy l _ _ _ _ = statFail l "theory_to_taxonomy"
-- | print a whole theory
printTheory :: StaticAnalysis lid basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol
=> Maybe IRI -> lid -> (sign, [Named sentence]) -> Doc
printTheory sm lid th@(s, l) = case
(convertTheory lid, basicSpecPrinter sm lid) of
(Just c, Just p) -> p (c th)
_ -> print_sign lid s $++$ vsep (map (print_named lid) l)
-- | guarded inclusion
inclusion :: StaticAnalysis lid basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol
=> lid -> sign -> sign -> Result morphism
inclusion l s1 s2 = if is_subsig l s1 s2 then subsig_inclusion l s1 s2
else fail $ show $ fsep
[ text (language_name l)
, text "symbol(s) missing in target:"
, pretty $ Set.difference (symset_of l s1) $ symset_of l s2 ]
{- | semi lattices with top (needed for sublogics). Note that `Ord` is
only used for efficiency and is not related to the /partial/ order given
by the lattice. Only `Eq` is used to define `isSubElem` -}
class (Ord 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 _ = ()
-- | 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
-- | 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
-- | a class for providing a sublogi name
class SublogicName l where
sublogicName :: l -> String
instance SublogicName () where
sublogicName () = ""
-- | a type for syntax information eventually stored in the signature
type SyntaxTable = (PrecMap, AssocMap)
{- 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 abstraction 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 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,
Convertible sublogics,
SublogicName sublogics,
Ord proof_tree, Show proof_tree,
Convertible proof_tree)
=> 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
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]
{- a bottom sublogic can be extended along several dimensions
joining all last elements of a dimension should yield the top-sublogic
-}
bottomSublogic :: lid -> Maybe sublogics
bottomSublogic _ = Nothing
sublogicDimensions :: lid -> [[sublogics]]
sublogicDimensions li = [all_sublogics li]
-- | parse sublogic (override more efficiently)
parseSublogic :: lid -> String -> Maybe sublogics
parseSublogic li s = lookup s $ map (\ l -> (sublogicName l, l))
$ all_sublogics li
{- | provide the embedding of a projected signature into the
original signature -}
proj_sublogic_epsilon :: lid -> sublogics -> sign -> morphism
proj_sublogic_epsilon _ _ = ide
-- --------------------- provers ---------------------------
-- | several provers can be provided. See module "Logic.Prover"
provers :: lid -> [Prover sign sentence morphism sublogics proof_tree]
provers _ = []
-- | consistency checkers
cons_checkers :: lid
-> [ConsChecker sign sentence
sublogics morphism proof_tree]
cons_checkers _ = []
-- | conservativity checkers
conservativityCheck :: lid
-> [ConservativityChecker sign sentence morphism]
conservativityCheck _ = []
-- | the empty proof tree
empty_proof_tree :: lid -> proof_tree
empty_proof_tree l = statError l "empty_proof_tree"
-- --------------------- OMDoc ---------------------------
syntaxTable :: lid -> sign -> Maybe SyntaxTable
syntaxTable _ _ = Nothing
omdoc_metatheory :: lid -> Maybe OMDoc.OMCD
{- default implementation, no logic should throw an error here
and the base of omcd should be a parseable URI -}
omdoc_metatheory _ = Nothing
export_symToOmdoc :: lid -> OMDoc.NameMap symbol
-> symbol -> String -> Result OMDoc.TCElement
export_symToOmdoc l _ _ = statFail l "export_symToOmdoc"
export_senToOmdoc :: lid -> OMDoc.NameMap symbol
-> sentence -> Result OMDoc.TCorOMElement
export_senToOmdoc l _ _ = statFail l "export_senToOmdoc"
{- | additional information which has to be exported can be
exported by this function -}
export_theoryToOmdoc :: lid -> OMDoc.SigMap symbol -> sign
-> [Named sentence] -> Result [OMDoc.TCElement]
{- default implementation does no extra export
, sufficient in some cases -}
export_theoryToOmdoc _ _ _ _ = return []
omdocToSym :: lid -> OMDoc.SigMapI symbol -> OMDoc.TCElement
-> String -> Result symbol
omdocToSym l _ _ _ = statFail l "omdocToSym"
omdocToSen :: lid -> OMDoc.SigMapI symbol -> OMDoc.TCElement
-> String -> Result (Maybe (Named sentence))
omdocToSen l _ _ _ = statFail l "omdocToSen"
{- | Algebraic Data Types are imported with this function.
By default the input is returned without changes. -}
addOMadtToTheory :: lid -> OMDoc.SigMapI symbol
-> (sign, [Named sentence]) -> [[OMDoc.OmdADT]]
-> Result (sign, [Named sentence])
-- no logic should throw an error here
addOMadtToTheory l _ t adts = do
unless (null adts) $ warning ()
(concat [ "ADT handling not implemented for logic "
, show l, " but some adts have to be handled" ])
nullRange
return t
{- | additional information which has to be imported can be
imported by this function. By default the input is returned
without changes. -}
addOmdocToTheory :: lid -> OMDoc.SigMapI symbol
-> (sign, [Named sentence]) -> [OMDoc.TCElement]
-> Result (sign, [Named sentence])
-- no logic should throw an error here
addOmdocToTheory _ _ t _ = return t
{- The class of logics which can be used as logical frameworks, in which object
logics can be specified by the user. Currently the only logics implementing
this class are LF, Maude, and Isabelle, with the latter two only having
dummy implementations.
The function "base_sig" returns the base signature of the framework -
for details see Integrating Logical Frameworks in Hets by M. Codescu et al
(WADT10).
The function "write_logic" constructs the contents of the Logic_L
file, where L is the name of the object logic passed as an argument.
Typically, this file will declare the lid of the object logic L and
instances of the classes Language, Syntax, Sentences, Logic, and
StaticAnalysis. The instance of Category is usually inherited from
the framework itself as the object logic reuses the signatures and
morphisms of the framework.
The function "write_syntax" constructs the contents of the file declaring
the Ltruth morphism (see the reference given above). If proofs and models
are later integrated into Hets, there should be analogous functions
"write_proofs" and "write_models" added, declaring the Lpf and
Lmod morphisms respectively. -}
class Logic lid sublogics basic_spec sentence
symb_items symb_map_items sign
morphism symbol raw_symbol proof_tree
=> LogicFram 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
-- | the base signature
base_sig :: lid -> sign
base_sig l = error $ "Function base_sig nyi for logic " ++ shows l "."
{- | generation of the object logic instances
second argument is object logic name -}
write_logic :: lid -> String -> String
write_logic l = error
$ "Function write_logic nyi for logic " ++ shows l "."
{- | generation of the Ltruth morphism declaration
second argument is the object logic name
third argument is the Ltruth morphism -}
write_syntax :: lid -> String -> morphism -> String
write_syntax l = error $
"Function write_syntax nyi for logic " ++ shows l "."
write_proof :: lid -> String -> morphism -> String
write_proof l = error $
"Function write_proof nyi for logic " ++ shows l "."
write_model :: lid -> String -> morphism -> String
write_model l = error $
"Function write_model nyi for logic " ++ shows l "."
read_morphism :: lid -> FilePath -> morphism
read_morphism l _ = error $
"Function read_morphism nyi for logic " ++ shows l "."
write_comorphism :: lid -> String -> String -> String
-> morphism -> morphism -> morphism
-> String
write_comorphism l = error $
"Function write_comorphism nyi for logic " ++ shows l "."
{- --------------------------------------------------------------
Derived functions
-------------------------------------------------------------- -}
-- | the empty theory
emptyTheory :: StaticAnalysis lid
basic_spec sentence symb_items symb_map_items
sign morphism symbol raw_symbol =>
lid -> Theory sign sentence proof_tree
emptyTheory 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
deriving Typeable
instance GetRange AnyLogic
instance Show AnyLogic where
show (Logic lid) = language_name lid
instance Eq AnyLogic where
a == b = compare a b == EQ
instance Ord AnyLogic where
compare = comparing show
{- class hierarchy:
Language
__________/
Category
| /
Sentences Syntax
\ /
StaticAnalysis (no sublogics)
|
|
Logic
-}