IsabelleCmds.hs

module IsabelleCmds where
import Prelude hiding (print)
import PFE0(pput,epput,getSubGraph)
import PFE3(parseModule)
import PFE4(rewriteAndTypeCheckModule,topTypes)
import PFE_Rewrites(fbRewrite,lcRewrite,flRewrite,pmRewrite,compRw,rwFun)
import HsModule(HsModuleI(..),hsModImportsFrom)
import PfeDepCmds(tdepgraph)
import PfeParse(moduleArg,qualId)
import PfePropCmds(baseNames)
import TiClasses(filterDefs,fromDefs)
import TiSCC(sccD')
import PFEdeps(tdefinedNames,splitDecls,isDefaultDecl)
import HsIdent(getHSName)
import MapDeclMProp() -- ?
import DefinedNames(addName,definedNames)
import FreeNames(freeNames)
--import TiPropInstances()
import TiProp() -- for PFE, instance CheckRecursion ...
import TiTypes(Scheme(Forall),Typing((:>:)),Qual((:=>)))
import qualified PropSyntaxStruct as PPS -- (Q((:=>)))
import RemoveListCompProp()
--import TiPropDecorate(TiDecl)
--import PNT(PNT)

import qualified Prop2Isabelle as P2I
import qualified IsabelleAST as AST
--import qualified PropDecorate2Isabelle2 as Ti2S
import SimpFunBind
import RemoveListComp
import SimpFieldLabels(simpFieldLabels)

import AbstractIO(print)
import MUtils(( # ),(@@),apSnd)
import Sets(mkSet,elementOf)
import PrettyPrint((<+>),pp)

isabelleCmds =
  [("isabelle", (moduleArg isabelle,"simple translation of one module to Isabelle")),
   ("isabelleslice", (qualId isabelleSlice,"translate a slice to Isabelle"))]

isabelleSlice qn = undefined -- slice' qn =<< transModule

isabelle m =
  do -- simplify <- rwFun $ foldr1 compRw [lcRewrite]
     let transM = {-simplify .-} addName
     parsed <- fmap snd (parseModule m)
     Just types <- fmap (lookup m) (topTypes (Just [m]))
     let decls1 = hsModDecls parsed
         decls2 = transM decls1
         decls3 = sccD2 decls2
         decls4 = map P2I.transDecs decls3
         decls5 = map P2I.combineDecls decls4
         decls6 = P2I.addConstsDecls (typetable types) decls5
         isamod = AST.Module (header parsed) decls6
     print isamod

sccD2 ds = sccD' names ds
  where names d = (map fst (definedNames d), map fst (freeNames d))

header m = (pp (hsModName m), map pp (hsModImportsFrom m))

typetable (_,(_,(_,(_,xs)))) = map f xs
  where f (i :>: (Forall _ _ (c :=> t))) = (pp i, P2I.transQType (c PPS.:=> t))

{-
use function besides hsModDecls to get module name, imports, exports
topTypes [m] returns PFE4Info
-}
{-
transModule =
  do simplify <- rwFun $ foldr1 compRw [lcRewrite]
     let transM = P2I.transDecs . simplify . addName
     return transM

slice' q@(m,n) trans =
  do ms <- map (fst.snd) # getSubGraph (Just [m])
     (_,(_,_,used)) <- tdepgraph [q]
     let needed = mkSet used
     slices <- mapM (moduleSlice needed) ms
     let defs = concatMap trans slices
         isamod = P2I.defs2module "" [] defs
     print isamod

moduleSlice needed m =
    --filter isNeeded . t . splitDecls . fromDefs . hsModDecls # rewriteAndTypeCheckModule simplify m
    filter isNeeded . splitDecls . hsModDecls . snd # parseModule m
  where
    isNeeded d = isDefaultDecl d || isNeeded' d
    isNeeded' = any (`elementOf` needed) . map getHSName . tdefinedNames False m
    --t = id :: [TiDecl PNT] -> [TiDecl PNT]
-}

Plain-text version of IsabelleCmds.hs | Valid HTML?