HaRe-0.6: tools/property/toy/Translate.hs
-- $Id: Translate.hs,v 1.1 2001/03/19 17:55:45 moran Exp $
module Translate where
import Syntax
import List((\\))
type Translator a b = [Name] -> [Name] -> a -> b
translateProp :: Translator Prop EscProp
translateProp metas env (Eval p) =
EscEval $ translateE translateProp metas env p
translateProp metas env (Prop p) =
EscProp $ translateP (translateId Var) codeExp translateProp metas env p
where codeExp metas env e = Code $ translateExp metas env e
translateProp metas env (Term e) =
EscTerm $ Code $ translateExp metas env e
translateExp :: Translator Exp EscExp
translateExp metas env (ExpEval e) =
EscExpEval $ translateE translateExp metas env e
translateExp metas env (ExpId v) =
EscExpId $ translateId Escape metas env v
translateId :: (Name -> Id) -> Translator Id Id
translateId meta metas env (Var v) =
if v `elem` metas then meta v else Var v
translateId meta metas env v = v
translateE :: Translator ea eb -> Translator (E ea Name) (E eb Name)
translateE te metas env (App e f) = App (te metas env e) (te metas env f)
translateE te metas env (Lambda vs e) = Lambda vs $
te (metas \\ vs) (env ++ vs) e
translateP :: Translator Id Id -> Translator ta tb -> Translator pa pb ->
Translator (P Id ta pa) (P Id tb pb)
translateP ti tt tp metas env (p1 `And` p2) =
(tp metas env p1) `And` (tp metas env p2)
translateP ti tt tp metas env (p1 `Or` p2) =
(tp metas env p1) `Or` (tp metas env p2)
translateP ti tt tp metas env (p1 `Implies` p2) =
(tp metas env p1) `Implies` (tp metas env p2)
translateP ti tt tp metas env (p1 `Iff` p2) =
(tp metas env p1) `Iff` (tp metas env p2)
translateP ti tt tp metas env (t1 `Equiv` t2) =
(tt metas env t1) `Equiv` (tt metas env t2)
translateP ti tt tp metas env (Exists i p) =
Exists (ti metas env i) (tp (nameOf i : metas) env p)
translateP ti tt tp metas env (All i p) =
All (ti metas env i) (tp (nameOf i : metas) env p)
translateP ti tt tp metas env Truth = Truth
translateP ti tt tp metas env Falsehood = Falsehood
nameOf (Var n) = n
nameOf (Escape n) = n