Advertisement
Guest User

Untitled

a guest
Mar 24th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. type Symb = String
  2.  
  3. infixl 4 :@:
  4. infixr 3 >->
  5.  
  6. data Expr = Idx Int
  7.           | Ast
  8.           | Box
  9.           | Expr :@: Expr
  10.           | Lmb Decl Expr
  11.           | Pi Decl Expr
  12.     deriving (Read,Show,Eq,Ord)
  13.  
  14. data Decl = EDecl Symb Expr
  15.     deriving (Read,Show,Ord)
  16.  
  17. instance Eq Decl where
  18.   EDecl _ t1 == EDecl _ t2 = t1 == t2
  19.  
  20. type Env = [Decl]
  21.  
  22. type Rule = (Expr,Expr)
  23.  
  24. rulesS,rulesF,rulesO,rulesP,rulesFO,rulesPF,rulesPO,rulesPFO :: [Rule]
  25. rulesS   = [(Ast,Ast)]
  26. rulesF   = (Box,Ast) : rulesS
  27. rulesO   = (Box,Box) : rulesS
  28. rulesP   = (Ast,Box) : rulesS
  29. rulesFO  = (Box,Ast) : rulesO
  30. rulesPF  = (Ast,Box) : rulesF
  31. rulesPO  = (Ast,Box) : rulesO
  32. rulesPFO = (Ast,Box) : rulesFO
  33.  
  34. lE, pE :: Symb -> Expr -> Expr -> Expr
  35. lE v = Lmb . EDecl v
  36. pE v = Pi  . EDecl v
  37.  
  38. (>->) :: Expr -> Expr -> Expr
  39. a >-> b = pE "_" a (shift 1 b)
  40. ----------------------
  41.  
  42. validEnv :: [Rule] -> Env -> Bool
  43. validEnv rule [] = True
  44. validEnv rule (EDecl v t : ds)
  45.   | Just s <- infer rule ds t >>= isSort = True  -- environment is being checked inside 'infer'
  46.   | otherwise                            = False
  47.  
  48. infer :: [Rule] -> Env -> Expr -> Maybe Expr
  49. infer rule env expr
  50.   | validEnv rule env = infer' rule env expr
  51.  | otherwise         = Nothing
  52.  
  53. infer' :: [Rule] -> Env -> Expr -> Maybe Expr
  54. infer' _   _         Ast                   = Just Box
  55. infer' rule env      (Idx n)
  56.   | 0 <= n && n < length env, -- we do not check environment here, because it's being checked only once in 'infer'
  57.     EDecl _ t <- env !! n  
  58.                                       = Just (shift (n + 1) t)
  59. infer' rule env      (m :@: n)
  60.  | Just (Pi (EDecl x a) b) <- nf <$> infer' rule env m,
  61.     Just a'                 <- infer' rule env n,
  62.     a' == a || nf a == nf a'
  63.                                       = Just $ subst0 n b
  64. infer' rule env      (Lmb d@(EDecl x a) m)
  65.  | Just s1   <- (infer' rule env a) >>= isSort,
  66.     Just b    <- infer' rule (d : env) m,
  67.    Just s2   <- (infer' rule env (Pi d b)) >>= isSort
  68.                                       = Just $ Pi d b
  69.  
  70. infer' rule env      (Pi d@(EDecl x a) b)
  71.  | Just s1 <- infer' rule env a,
  72.     isSort s1 /= Nothing,
  73.     Just s2 <- infer' rule (d:env) b,
  74.    isSort s2 /= Nothing,
  75.    (s1, s2) `elem` rule            
  76.                                      = Just s2
  77.                    
  78. infer' _ _          _                   = Nothing
  79.  
  80. infer0 :: [Rule] -> Expr -> Maybe Expr
  81. infer0 rls = infer rls []
  82.  
  83. isSort :: Expr -> Maybe Expr
  84. isSort Box = Just Box
  85. isSort Ast = Just Ast
  86. isSort _   = Nothing
  87.  
  88. shift :: Int -> Expr -> Expr
  89. shift val = shiftAbove 0 where
  90.   shiftAbove cut Ast = Ast
  91.   shiftAbove cut Box = Box
  92.   shiftAbove cut (Idx k)
  93.                          | k < cut   = Idx k
  94.                          | otherwise = Idx $ k + val
  95.   shiftAbove cut (u :@: w)           = shiftAbove cut u :@: shiftAbove cut w
  96.   shiftAbove cut (Lmb (EDecl v t) u) = Lmb (EDecl v $ shiftAbove cut t) $ shiftAbove (cut + 1) u
  97.   shiftAbove cut (Pi (EDecl v t) u)  = Pi (EDecl v $ shiftAbove cut t) $ shiftAbove (cut + 1) u
  98.  
  99. subst :: Int -> Expr -> Expr -> Expr
  100. subst j s (Idx k)
  101.          | k == j    = s
  102.          | otherwise = Idx k
  103. subst j s (Lmb (EDecl x t) u) = Lmb (EDecl x $ subst j s t) $ subst (j + 1) (shift 1 s) u
  104. subst j s (u :@: w) = subst j s u :@: subst j s w
  105. subst j s (Pi (EDecl x t) u) = Pi (EDecl x $ subst j s t) $ subst (j + 1) (shift 1 s) u
  106. subst j s expr = expr
  107.  
  108. subst0 s u = shift (-1) $ subst 0 (shift 1 s) u
  109.  
  110. oneStep :: Expr -> Maybe Expr
  111. oneStep Ast             = Nothing
  112. oneStep Box             = Nothing
  113. oneStep (Idx k)         = Nothing
  114.  
  115. oneStep (Lmb (EDecl x t) u)
  116.   | Just t' <- oneStep t    = Just $ Lmb (EDecl x t') u
  117.   | Just u' <- oneStep u    = Just $ Lmb (EDecl x t ) u'
  118.   | otherwise               = Nothing
  119.  
  120. oneStep (Lmb _ u :@: w) = Just $ subst0 w u
  121.  
  122. oneStep (u :@: w)    
  123.   | Just u' <- oneStep u    = Just $ u' :@: w
  124.   | Just w' <- oneStep w    = Just $ u  :@: w'
  125.   | otherwise               = Nothing
  126.  
  127. oneStep (Pi (EDecl x a) m)
  128.   | Just a' <- oneStep a    = Just $ Pi (EDecl x a') m
  129.   | Just m' <- oneStep m    = Just $ Pi (EDecl x a)  m'
  130.   | otherwise               = Nothing
  131.  
  132. nf :: Expr -> Expr
  133. nf = nfWith oneStep
  134.  
  135. nfWith :: (Expr -> Maybe Expr) -> Expr -> Expr
  136. nfWith f t | Just r <- f t = nfWith f r
  137.            | otherwise     = t
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement