-
Notifications
You must be signed in to change notification settings - Fork 0
/
ArrMp.hs
60 lines (39 loc) · 1.06 KB
/
ArrMp.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
-- Minimal implicational logic, PHOAS approach, initial encoding
{-# LANGUAGE DataKinds, GADTs, KindSignatures, Rank2Types, Safe, TypeOperators #-}
module Pi.ArrMp where
-- Types
infixr 0 :=>
data Ty :: * where
UNIT :: Ty
(:=>) :: Ty -> Ty -> Ty
-- Context and truth judgement
-- NOTE: Haskell does not support kind synonyms
-- type Cx = Ty -> *
type IsTrue (a :: Ty) (tc :: Ty -> *) = tc a
-- Terms
infixl 1 :$
data Tm :: (Ty -> *) -> Ty -> * where
Var :: IsTrue a tc -> Tm tc a
Lam :: (IsTrue a tc -> Tm tc b) -> Tm tc (a :=> b)
(:$) :: Tm tc (a :=> b) -> Tm tc a -> Tm tc b
var :: IsTrue a tc -> Tm tc a
var = Var
lam :: (Tm tc a -> Tm tc b) -> Tm tc (a :=> b)
lam f = Lam $ \x -> f (var x)
type Thm a = forall tc. Tm tc a
-- Example theorems
aI :: Thm (a :=> a)
aI =
lam $ \x -> x
aK :: Thm (a :=> b :=> a)
aK =
lam $ \x ->
lam $ \_ -> x
aS :: Thm ((a :=> b :=> c) :=> (a :=> b) :=> a :=> c)
aS =
lam $ \f ->
lam $ \g ->
lam $ \x -> f :$ x :$ (g :$ x)
tSKK :: Thm (a :=> a)
tSKK =
aS :$ aK :$ aK