packages feed

DrHylo-0.0.1: src/PwPf.hs

module PwPf where

import Language.Pointwise.Syntax as Pointwise
import Language.Pointfree.Syntax as Pointfree hiding (Const)

type Ctx = [String]

path :: Ctx -> String -> Pointfree.Term
path [] x = Point x
path (x:xs) y | x==y = SND
	      | otherwise = path xs y :.: FST

pwpf :: Ctx -> Pointwise.Term -> Pointfree.Term 
pwpf e (Var x)   = path e x
pwpf e (Lam x t) = Curry (pwpf (x:e) t)
pwpf e (l :@: r) = AP :.: (pwpf e l :/\: pwpf e r)
pwpf e Unit      = BANG
pwpf e (Const s) = Point s :.: BANG
pwpf e (l :&: r) = pwpf e l :/\: pwpf e r
pwpf e (Fst t)   = FST :.: pwpf e t
pwpf e (Snd t)   = SND :.: pwpf e t
pwpf e (Case t l r) = 
    AP :.: ((Macro "eithr" [] :.: (pwpf e l :/\: pwpf e r)) :/\: pwpf e t)
pwpf e (Inl t)   = INL :.: pwpf e t
pwpf e (Inr t)   = INR :.: pwpf e t
pwpf e (In t)    = IN :.: pwpf e t
pwpf e (Out t)   = OUT :.: pwpf e t
pwpf e (Pointwise.Fix t)   = Macro "fix" [] :.: pwpf e t

unpoint :: Pointfree.Term -> Pointfree.Term
unpoint f = AP :.: ((f :.: BANG) :/\: ID)