IsaSign.hs revision 617719566ec7a718fc4f601c02ca91f21ca6deb6
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktModule : $Header$
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktDescription : abstract Isabelle HOL and HOLCF syntax
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktCopyright : (c) University of Cambridge, Cambridge, England
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt adaption (c) Till Mossakowski, Uni Bremen 2002-2005
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktLicense : GPLv2 or higher, see LICENSE.txt
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktMaintainer : Christian.Maeder@dfki.de
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktStability : provisional
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktPortability : portable
e3169126793f43be3d840874ffb3935a51097001Patrik FlyktData structures for Isabelle signatures and theories.
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt Adapted from Isabelle.
e3169126793f43be3d840874ffb3935a51097001Patrik Flyktimport qualified Data.Map as Map
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt--------------- not quite from src/Pure/term.ML ------------------------
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt------------------------ Names -----------------------------------------
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt-- | type names
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykttype TName = String
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt-- | names for values or constants (non-classes and non-types)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktdata VName = VName
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt { new :: String -- ^ name within Isabelle
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt , altSyn :: Maybe AltSyntax -- ^ mixfix template syntax
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt } deriving Show
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktdata AltSyntax = AltSyntax String [Int] Int deriving (Show, Eq, Ord)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt-- | the original (Haskell) name
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktorig :: VName -> String
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktinstance Eq VName where
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt v1 == v2 = new v1 == new v2
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktinstance Ord VName where
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt v1 <= v2 = new v1 <= new v2
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt{- | Indexnames can be quickly renamed by adding an offset to
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt the integer part, for resolution. -}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktdata Indexname = Indexname
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt { unindexed :: String
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt , indexOffset :: Int
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt } deriving (Ord, Eq, Show)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykt{- Types are classified by sorts. -}
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flyktdata IsaClass = IsaClass String deriving (Ord, Eq, Show)
f12abb48fc510b8b349c05e35ba048134debaf25Patrik Flykttype Sort = [IsaClass]
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt{- The sorts attached to TFrees and TVars specify the sort of
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt that variable -}
e3169126793f43be3d840874ffb3935a51097001Patrik Flyktdata Typ = Type { typeId :: TName,
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt typeSort :: Sort,
e3169126793f43be3d840874ffb3935a51097001Patrik Flykt typeArgs :: [Typ] }
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt | TFree { typeId :: TName,
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt typeSort :: Sort }
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt | TVar { indexname :: Indexname,
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt typeSort :: Sort }
f12ed3bf0b315fc88d5fbdf5bdca14b218c86e0cPatrik Flykt deriving (Eq, Ord, Show)
c6affce8740bb0cee42eebf6d1d44dd518035e88Patrik Flykt{- Terms. Bound variables are indicated by depth number.
c6affce8740bb0cee42eebf6d1d44dd518035e88Patrik Flykt Free variables, (scheme) variables and constants have names.
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt A term is "closed" if every bound variable of level "lev"
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt is enclosed by at least "lev" abstractions.
34e8c5a23cd1c53ef3c1169388dabe1f6dfd7319Patrik Flykt It is possible to create meaningless terms containing loose bound vars
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt or type mismatches. But such terms are not allowed in rules. -}
a9aff3615b430f86bd0a824214d95f634efaf894Patrik Flykt-- IsCont True - lifted; IsCont False - not lifted, used for constructors
631bbe71298ec892f77f44f94feb612646fe6853Patrik Flyktdata Continuity = IsCont Bool | NotCont deriving (Eq, Ord, Show)
-- | describing the set comprehension e.g. x Nat "even x" would be
-- | A set declared using a list of terms. e.g. {1,2,3} would be Set [1,2,3]
-------------------- from src/Pure/sorts.ML ------------------------
(already defined in Pure/term.ML)
type Classrel = Map.Map IsaClass ClassDecl
type Locales = Map.Map String LocaleDecl
type Defs = Map.Map String Def
type Funs = Map.Map String FunDef
type Arities = Map.Map TName [(IsaClass, [(Typ, Sort)])]
type Abbrs = Map.Map TName ([TName], Typ)
classrel = Map.empty,
locales = Map.empty,
defs = Map.empty,
funs = Map.empty,
abbrs = Map.empty,
arities = Map.empty }
Map.isSubmapOf (classrel t1) (classrel t2) &&
Map.isSubmapOf (locales t1) (locales t2) &&
Map.isSubmapOf (defs t1) (defs t2) &&
Map.isSubmapOf (funs t1) (funs t2) &&
Map.isSubmapOf (abbrs t1) (abbrs t2) &&
Map.isSubmapOf (arities t1) (arities t2)
-------------------- from src/Pure/sign.ML ------------------------
or recursively as Isabelle.Sign -}
type ConstTab = Map.Map VName Typ
, constTab = Map.empty
Map.isSubmapOf (constTab s1) (constTab s2) &&
classrel = Map.union (classrel t1) (classrel t2),
locales = Map.union (locales t1) (locales t2),
defs = Map.union (defs t1) (defs t2),
funs = Map.union (funs t1) (funs t2),
log_types = Data.List.union (log_types t1) (log_types t2),
abbrs = Map.union (abbrs t1) (abbrs t2),
arities = Map.union (arities t1) (arities t2)
constTab = Map.union (constTab s1) (constTab s2),
domainTab = Data.List.union (domainTab s1) (domainTab s2)
-- should be used at the end of the apply proof method. e.g. Apply(A,B,C)