Reusable functions for translation from the (non-recursive) P-Logic structure to Stratego.
module PropStruct2Stratego2 where
import StrategoAST2 as S
import PropSyntaxStruct as P
import HsPropMaps
import HsPropPretty()
import PrettyPrint(pp)
import Maybe(fromMaybe)
transPD trId trPA trPP pd =
case mapPD trId trPA trPP pd of
HsPropDecl s n ns p -> property (PredDecl (S.PredAbs (n,transPredParams ns),p))
HsAssertion s (Just n) a -> assert (PropDecl (n,a))
_ -> ignored (pp pd)
transPredParams = map transPredParam
transPredParam (HsCon c) = predParam c
transPredParam (HsVar x) = termParam x
--predParam (HsVar x) = "Not supported: Predicate definition: values as parameters" -- !!!
transPA trId trE trT trPA trPP pa =
case mapPA trId trE trT trPA trPP pa of
P.Quant q i optt pa -> S.Quant ([quant q (i,t)],pa)
where t = fromMaybe (tVar "dummy") optt
PropApp i ts [] -> propVar i
PropApp i ts es -> HasMult (map predArg es,predVar i) -- !!
PropNeg a -> propNeg a
PropOp op a1 a2 -> propOp op a1 a2
PropEqual e1 e2 -> Equal (e1, e2)
PropHas e p -> Has (e,p)
PropParen a -> a
_ -> not_supported "Assertion" pa
where
quant q =
case q of
P.All -> S.All
Exist -> Exists
propOp op a1 a2 =
case op of
P.Conj -> propConj [a1,a2]
P.Disj -> propDisj [a1,a2]
P.Imp -> Implies ([a1],a2)
P.Equiv-> S.Equiv (a1,a2)
predArg = either id bad
bad _ = not_supported "Predicate arguments" pa
transPP trId trE trP trT trPA trPP pred =
case mapPP trId trE trP trT trPA trPP pred of
PredApp i ts [] -> predVar i
PredApp i ts ps -> DataCong (i,map transPredArg ps) -- !!!
PredArrow p1 p2 -> Arrow (p1,p2)
PredInfixApp p1 i p2 -> DataCong (i,map predArg [p1,p2])
P.PredNeg optt p -> predNeg p
PredOp op optt p1 p2 -> predOp op p1 p2
PredLfp i _ p -> LfpPred (i,p)
PredGfp i _ p -> GfpPred (i,p)
PredNil -> DataCong ("[]",[])
PredLifted e -> liftedSec e
PredStrong p -> strong p
PredParen p -> p
PredComp pts a -> Comprehension (map fst pts,a)
P.PredAbs is p -> PredAbsP (transPredParams is,p)
_ -> not_supported "Predicate" pred
where
transPredArg = either termArg predArg
--bad _ = not_supported "Predicate application" "values as arguments"
predOp op a1 a2 =
case op of
P.Conj -> predConj [a1,a2]
P.Disj -> predDisj [a1,a2]
P.Imp -> PredImpl ([a1],a2)
P.Equiv-> PredEquiv (a1,a2)
transQ trC trT (c:=>t) = tarrows ({-map tPred-} (trC c)) (trT t) -- ???
not_supported s x = error $ s++" not supported (yet): "++pp x