packages feed

HaRe-0.6: tools/TFF/Preds.hs

module Preds where

import Syntax hiding (lookUp)
import PrettyPrint

import TFFMonad
import TypesTerms


--------------------------------------------------------------------------------
-- Theorems
--

data Pred
    = Term := Term 
    | Pred :=> Pred 
    | Pred :/\ Pred 
    | Forall Term Pred              -- Term should be a Var term
        deriving (Eq,Show)

instance Printable Pred where
    ppi ((t1,_) := (t2,_))  = ppi t1 <+> text "=" <+> ppi t2
    ppi (p :=> q)           = wrap p <+> text "==>" <+> wrap q
    ppi (p :/\ q)           = wrap p <+> text "/\\" <+> wrap q
    ppi (Forall a p)        = text "!" <> ppTerm a <> text "."
                              $$ nest 4 (ppi p)


getRel :: Type -> Term -> Term -> FM Pred
getRel (Type ty) t1 t2
    = case ty of

        HsTyCon n -> return (t1 := t2)

        HsTyFun p q -> do
            { x  <- newVar (dom t1) 
            ; y  <- newVar (dom t2)
            ; r1 <- getRel p x y    
            ; r2 <- getRel q (applyTerm t1 x) (applyTerm t2 y)
            ; return $ Forall x $ Forall y $ r1 :=> r2
            } 


        HsTyVar a -> do
            { f <- lookUp a 
            ; return (t2 := applyTerm f t1)
            }


getRel (TyAll n t) t1 t2 = do
            { x <- newTVar
            ; y <- newTVar
            ; f <- newVar (mkTyFun x y)
            ; p <- inExtendedEnv n f $
                getRel t (applyType t1 x) (applyType t2 y)
            ; return (Forall f p)
            }
--
--------------------------------------------------------------------------------