PropStruct2Stratego2.hs

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

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