a type theory with equality based on setoids
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

441 lines
14 KiB

  1. {-# LANGUAGE FlexibleContexts #-}
  2. {-# LANGUAGE LambdaCase #-}
  3. {-# LANGUAGE ViewPatterns #-}
  4. {-# LANGUAGE BlockArguments #-}
  5. {-# LANGUAGE OverloadedStrings #-}
  6. module Evaluate where
  7. import qualified Control.Exception as Exc
  8. import Control.Monad.Except
  9. import Control.Monad.Reader
  10. import Control.Concurrent
  11. import qualified Data.IntMap.Strict as IntMap
  12. import qualified Data.Sequence as Seq
  13. import qualified Data.Text as T
  14. import Elaboration.Monad
  15. import GHC.Stack (HasCallStack)
  16. import Generics.SYB (mkT, everywhere)
  17. import Syntax
  18. import System.IO.Unsafe
  19. import Value
  20. import Data.Foldable
  21. import Syntax.Pretty (showWithPrec)
  22. evaluate :: HasCallStack => Env -> Term -> Value
  23. evaluate env (Var (Bound i)) =
  24. case Seq.lookup i (locals env) of
  25. Just x -> x
  26. Nothing -> error $ "Variable of index " ++ show i ++ " not in scope"
  27. evaluate _ (Con t) = VGlued (HCon t) mempty Nothing
  28. evaluate _ Type = VType
  29. evaluate env (Pi p t d r) = VPi p t (evaluate env d) (Closure env r)
  30. evaluate env (Lam p t b) = VLam p t (Closure env b)
  31. evaluate env (App p f x) = vApp (evaluate env f) p (evaluate env x)
  32. evaluate env (Sigma t d r) = VSigma t (evaluate env d) (Closure env r)
  33. evaluate env (Pair a b) = VPair (evaluate env a) (evaluate env b)
  34. evaluate env (Proj1 a) = vProj1 (evaluate env a)
  35. evaluate env (Proj2 a) = vProj2 (evaluate env a)
  36. evaluate _ (Meta m) = VGlued (HMeta m) mempty Nothing
  37. evaluate env (NewMeta m mask) = VGlued (HMeta m) (getVals (locals env) mask) Nothing where
  38. getVals Seq.Empty [] = Seq.Empty
  39. getVals (v Seq.:<| seq) (BDBound _:bds) = AppEx v Seq.:<| getVals seq bds
  40. getVals (_ Seq.:<| seq) (BDDefined _:bds) = getVals seq bds
  41. evaluate _ Top = VTop
  42. evaluate _ Unit = VUnit
  43. evaluate _ Refl = VGlued HRefl mempty Nothing
  44. evaluate _ Coe =
  45. function Im (T.pack "A") $ \a ->
  46. function Im (T.pack "B") $ \b ->
  47. function Ex (T.pack "p") $ \p ->
  48. function Ex (T.pack "x") $ \x ->
  49. vCoe a b p x
  50. evaluate _ Cong =
  51. function Im (T.pack "A") $ \a ->
  52. function Im (T.pack "B") $ \b ->
  53. function Im (T.pack "x") $ \x ->
  54. function Im (T.pack "y") $ \y ->
  55. function Ex (T.pack "f") $ \f ->
  56. function Ex (T.pack "p") $ \p ->
  57. vCong a b x y f p
  58. evaluate _ Sym =
  59. function Im (T.pack "A") $ \a ->
  60. function Im (T.pack "x") $ \x ->
  61. function Im (T.pack "y") $ \y ->
  62. function Ex (T.pack "p") $ \p ->
  63. vSym a x y p
  64. evaluate e (Let _ _ c d) = evaluate e' d where
  65. e' = e { locals = evaluate e c Seq.:<| locals e }
  66. evaluate env (Id a b c) = vId (evaluate env a) (evaluate env b) (evaluate env c)
  67. vId :: Value -> Value -> Value -> Value
  68. vId kind a b =
  69. let stuck = VEq kind a b
  70. solve = VEqG kind a b
  71. never = solve vBottom
  72. always = solve VTop
  73. in
  74. case force kind of
  75. VType ->
  76. case (a, b) of
  77. (VTop, VTop) -> always
  78. (VType, VType) -> always
  79. (VEqG _ _ _ a, b) -> vId VType a b
  80. (a, VEqG _ _ _ b) -> vId VType a b
  81. (VEq a _ _, VEq b _ _) -> vId VType a b
  82. (VPi i _ d r, VPi i' _ d' r')
  83. | i == i' ->
  84. solve $
  85. exists "p" (vId VType d d') $ \p ->
  86. forAll Ex "x" d $ \x ->
  87. vId VType (r $$ x) (r' $$ vCoe d d' p x)
  88. | otherwise -> never
  89. (VSigma _ d r, VSigma _ d' r') ->
  90. solve $
  91. exists "p" (vId VType d d') $ \p ->
  92. forAll Ex "x" d $ \x ->
  93. vId VType (r $$ x) (r' $$ vCoe d d' p x)
  94. (VNe _ _, _) -> stuck
  95. (_, VNe _ _) -> stuck
  96. _ -> never
  97. VTop -> always
  98. VPi i t dom cod ->
  99. solve $ forAll i t dom \vl -> vId (cod $$ vl) (vApp a i vl) (vApp b i vl)
  100. VSigma t dom cod ->
  101. -- a = (x, p)
  102. -- b = (y, q)
  103. -- (a, b) ≡ (c, d) : (x : A) * P x
  104. -- ~> (path : a == c) * coe (cong A Type P path) b == d
  105. let x = vProj1 a
  106. y = vProj1 b
  107. p = vProj2 a
  108. q = vProj2 b
  109. in solve $
  110. exists t (vId dom x y) $ \pr ->
  111. vId (cod $$ y) (vCoe (cod $$ x) (cod $$ y) (vCong dom VType x y (function Ex (T.pack "x") (cod $$)) pr) p) q
  112. VEq{} -> solve VTop
  113. _ -> stuck
  114. vBottom :: Value
  115. vBottom = forAll Im "A" VType id
  116. vCoe :: VTy -> VTy -> Value -> Value -> Value
  117. -- vCoe _ _ (VGlued HRefl _ _) element = element
  118. vCoe (VPi i _ d r) ty2@(VPi i' _ d' r') p f
  119. | i /= i' = vApp p Ex ty2
  120. | otherwise =
  121. function i "x" $ \x ->
  122. let p1 = vProj1 p -- d == d'
  123. p2 = vProj2 p -- (x : A) -> r x == r' (coe p1 x)
  124. x0 = vCoe d' d (vSym VType d d' p1) x
  125. in vCoe (r $$ x0) (r' $$ x) (vApp p2 Ex x0) (vApp f i x0)
  126. vCoe tyA tyB proof element = splitFibration tyA tyB $ VGlued HCoe (Seq.fromList spine) Nothing where
  127. spine = [AppIm tyA, AppIm tyB, AppEx proof, AppEx element]
  128. -- Types are split fibrations
  129. -- coe {A} {A} p x = x even when p /= refl
  130. splitFibration tA tB vstuck = unsafeDupablePerformIO $ do
  131. old <- readMVar elabMetas
  132. t <- runElab (unify tA tB) emptyElabState
  133. case t of
  134. Left _ -> do
  135. swapMVar elabMetas old
  136. pure vstuck
  137. Right _ -> pure element
  138. vCong :: Value -> Value -> Value -> Value -> Value -> Value -> Value
  139. vCong _a c _x _y g (force -> VGlued HCong (toList -> [AppIm a, AppIm _b, AppIm x, AppIm y, AppEx f, AppEx p]) _) =
  140. VGlued HCong (Seq.fromList [AppIm a, AppIm c, AppIm x, AppIm y, AppEx (function Ex "x" (vApp g Ex . vApp f Ex)), AppEx p]) Nothing
  141. vCong _a b _x _ f (force -> VGlued HRefl (toList -> [AppIm _, AppIm x]) _) =
  142. VGlued HRefl (Seq.fromList [AppIm b, AppIm (vApp f Ex x)]) Nothing
  143. vCong a b x y f p =
  144. VGlued HCong (Seq.fromList [AppIm a, AppIm b, AppIm x, AppIm y, AppEx f, AppEx p]) Nothing
  145. vSym :: Value -> Value -> Value -> Value -> Value
  146. vSym a _ y (VGlued HRefl _ Nothing) =
  147. VGlued HRefl (Seq.fromList [AppIm a, AppIm y]) Nothing
  148. vSym _ _ _ (VGlued HSym (toList -> [_a, _y, _x, AppEx p]) Nothing) = p
  149. vSym a x y p = VGlued HSym (Seq.fromList [AppIm a, AppIm x, AppIm y, AppEx p]) Nothing
  150. vApp :: HasCallStack => Value -> Plicity -> Value -> Value
  151. vApp (VGlued x s v) p r = VGlued x (s Seq.|> thing) (fmap (\v -> vApp v p r) v) where
  152. thing =
  153. case p of
  154. Ex -> AppEx r
  155. Im -> AppIm r
  156. vApp (VLam _ _ c) _ a = c $$ a
  157. vApp _fun _plic _arg = error "invalid application"
  158. vProj1 :: Value -> Value
  159. vProj1 (VPair a _) = a
  160. vProj1 x = VProj1 x
  161. vProj2 :: Value -> Value
  162. vProj2 (VPair _ a) = a
  163. vProj2 x = VProj2 x
  164. ($$) :: HasCallStack => Closure -> Value -> Value
  165. Closure e t $$ v = evaluate e' t where
  166. e' = e { locals = v Seq.:<| locals e }
  167. ClMeta (MetaFun f) $$ v = f v
  168. forAll :: Plicity -> T.Text -> Value -> (Value -> Value) -> Value
  169. forAll i t d = VPi i t d . ClMeta . MetaFun
  170. exists :: T.Text -> Value -> (Value -> Value) -> Value
  171. exists t d = VSigma t d . ClMeta . MetaFun
  172. function :: Plicity -> T.Text -> (Value -> Value) -> Value
  173. function i t = VLam i t . ClMeta . MetaFun
  174. quote :: HasCallStack => Level -> Value -> Term
  175. quote _ VType = Type
  176. quote l (VPi p t d r) = Pi p t (quote l d) (quote (succ l) (r $$ vVar (Bound (unLvl l))))
  177. quote l (VLam p t b) = Lam p t (quote (succ l) (b $$ vVar (Bound (unLvl l))))
  178. quote l (VSigma t d r) = Sigma t (quote l d) (quote (succ l) (r $$ vVar (Bound (unLvl l))))
  179. quote l (VPair a b) = Pair (quote l a) (quote l b)
  180. quote l (VProj1 a) = Proj1 (quote l a)
  181. quote l (VProj2 a) = Proj2 (quote l a)
  182. quote _ VTop = Top
  183. quote _ VUnit = Unit
  184. quote l (VEq a b c) = Id (quote l a) (quote l b) (quote l c)
  185. -- quote l (VEqG _ _ _ d) = quote l d
  186. quote l (VEqG a b c _) = Id (quote l a) (quote l b) (quote l c)
  187. quote l (VGlued v s _) = foldl app v' s where
  188. v' = case v of
  189. HVar (Bound i) -> Bv (lvl2Ix l (Lvl i))
  190. HCon t -> Con t
  191. HMeta m -> Meta m
  192. HRefl -> Refl
  193. HCoe -> Coe
  194. HCong -> Cong
  195. HSym -> Sym
  196. app f (AppEx t) = App Ex f (quote l t)
  197. app f (AppIm t) = App Im f (quote l t)
  198. app f SProj1 = Proj1 f
  199. app f SProj2 = Proj2 f
  200. force :: Value -> Value
  201. force = unsafeDupablePerformIO . go where
  202. go stuck@(VGlued (HMeta (MV m)) sp Nothing) = do
  203. t <- readMVar elabMetas
  204. case IntMap.lookup m t of
  205. Just (Solved vl) -> go $ foldl vAppSp vl sp
  206. _ -> pure stuck
  207. go (VGlued _ _ (Just vl)) = go vl
  208. go x = pure x
  209. vAppSp :: Value -> SpineThing -> Value
  210. vAppSp vl (AppEx f) = vApp vl Ex f
  211. vAppSp vl (AppIm f) = vApp vl Im f
  212. vAppSp vl SProj1 = vProj1 vl
  213. vAppSp vl SProj2 = vProj2 vl
  214. zonk :: Value -> Value
  215. zonk (VLam vis var body) = VLam vis var (ClMeta (MetaFun (\v -> zonk (body $$ v))))
  216. zonk (VPi vis var dom body) = VPi vis var (zonk dom) (ClMeta (MetaFun (\v -> zonk (body $$ v))))
  217. zonk (VSigma var dom body) = VSigma var (zonk dom) (ClMeta (MetaFun (\v -> zonk (body $$ v))))
  218. zonk t = everywhere (mkT force) t
  219. unify :: VTy -> VTy -> ElabM ()
  220. unify a b = asks elabLevel >>= flip go (a, b) where
  221. go, go' :: Level -> (VTy, VTy) -> ElabM ()
  222. go' l (VGlued h sp x, VGlued h' sp' y)
  223. | h == h' = goSpine l sp sp'
  224. | Just x <- x, Just y <- y = go l (x, y)
  225. -- flexible head (solve meta)
  226. go' l (VGlued (HMeta m) sp _, y) = solveMeta m sp y
  227. go' _ (x, VGlued (HMeta m) sp _) = solveMeta m sp x
  228. -- rigid heads (compare unfolding)
  229. go' l (VGlued _ _ (Just x), y) = go l (x, y)
  230. go' l (x, VGlued _ _ (Just y)) = go l (x, y)
  231. go' _ (VType, VType) = pure ()
  232. go' _ (VTop, VTop) = pure ()
  233. go' _ (VUnit, VUnit) = pure ()
  234. go' l (VPi i _ d r, VPi i' _ d' r') | i == i' = do
  235. go l (d, d')
  236. let i = unLvl l
  237. go (succ l) (r $$ vVar (Bound i), r' $$ vVar (Bound i))
  238. go' l (VSigma _ d r, VSigma _ d' r') = do
  239. go l (d, d')
  240. let i = unLvl l
  241. go (succ l) (r $$ vVar (Bound i), r' $$ vVar (Bound i))
  242. go' l (VLam i _ r, VLam i' _ r') | i == i' = do
  243. let i = unLvl l
  244. go (succ l) (r $$ vVar (Bound i), r' $$ vVar (Bound i))
  245. go' l (VLam p _ r, t) = do
  246. let i = unLvl l
  247. go (succ l) (r $$ vVar (Bound i), vApp t p (vVar (Bound i)))
  248. go' l (r, VLam p _ t) = do
  249. let i = unLvl l
  250. go (succ l) (vApp r p (vVar (Bound i)), t $$ vVar (Bound i))
  251. go' l (VEqG a b c _, VEqG a' b' c' _) = go l (a, a') *> go l (b, b') *> go l (c, c')
  252. go' l (VEq a b c, VEqG a' b' c' _) = go l (a, a') *> go l (b, b') *> go l (c, c')
  253. go' l (VEqG a b c _, VEq a' b' c') = go l (a, a') *> go l (b, b') *> go l (c, c')
  254. go' l (VEq a b c, VEq a' b' c') = go l (a, a') *> go l (b, b') *> go l (c, c')
  255. go' l (VEqG _ _ _ a, b) = go l (a, b)
  256. go' l (a, VEqG _ _ _ b) = go l (a, b)
  257. go' l (VProj1 a, VProj1 b) = go l (a, b)
  258. go' l (VProj2 a, VProj2 b) = go l (a, b)
  259. go' l (VPair a b, VPair a' b') = go l (a, a') >> go l (b, b')
  260. go' l (a, b) = do
  261. ns <- getNames
  262. typeError (NotEqual ns (quote l a) (quote l b))
  263. go l (a, b) = go' l (force a, force b)
  264. goSpine _ Seq.Empty Seq.Empty = pure ()
  265. goSpine l (AppEx x Seq.:<| xs) (AppEx y Seq.:<| ys) = do
  266. go l (x, y)
  267. goSpine l xs ys
  268. goSpine l (AppIm x Seq.:<| xs) (AppIm y Seq.:<| ys) = do
  269. go l (x, y)
  270. goSpine l xs ys
  271. goSpine l (x Seq.:<| xs) (y Seq.:<| ys) | x == y = goSpine l xs ys
  272. goSpine l _ _ = do
  273. ns <- getNames
  274. typeError (NotEqual ns (quote l a) (quote l b))
  275. solveMeta :: HasCallStack => MetaVar -> Seq.Seq SpineThing -> VTy -> ElabM ()
  276. solveMeta (MV meta) spine rhs =
  277. do
  278. level <- asks elabLevel
  279. pren <- invert level spine
  280. rhs <- rename (MV meta) pren rhs
  281. let solution = evaluate emptyEnv (lams (dom pren) rhs)
  282. -- need to deepSeq solutions here
  283. -- no deepSeq? no problem
  284. liftIO $ Exc.evaluate (length (show solution))
  285. liftIO . modifyMVar_ elabMetas $ pure . IntMap.insert meta (Solved solution)
  286. `catchError` \case
  287. [] -> do
  288. level <- asks elabLevel
  289. names <- getNames
  290. typeError (CantSolveMeta names (quote level (VGlued (HMeta (MV meta)) spine Nothing)) (quote level rhs))
  291. cs -> throwError cs
  292. elabMetas :: MVar (IntMap.IntMap Meta)
  293. elabMetas = unsafeDupablePerformIO (newMVar mempty)
  294. {-# NOINLINE elabMetas #-}
  295. lams :: Level -> Term -> Term
  296. lams l = go (Lvl 0) where
  297. go x t | x == l = t
  298. go x t = Lam Ex (T.pack ("x" ++ show (unLvl x))) $ go (succ x) t
  299. data PartialRen
  300. = PRen { dom :: {-# UNPACK #-} !Level
  301. , rng :: {-# UNPACK #-} !Level
  302. , sub :: IntMap.IntMap Level
  303. }
  304. deriving (Eq, Show, Ord)
  305. liftRen :: PartialRen -> PartialRen
  306. liftRen (PRen d r s) = PRen (succ d) (succ r) (IntMap.insert (unLvl r) d s)
  307. invert :: Level -> Seq.Seq SpineThing -> ElabM PartialRen
  308. invert gamma spine =
  309. do
  310. (dom, ren) <- go spine
  311. pure (PRen dom gamma ren)
  312. where
  313. go Seq.Empty = pure (Lvl 0, mempty)
  314. go (sp Seq.:|> AppEx t) = do
  315. (dom, ren) <- go sp
  316. case force t of
  317. VGlued (HVar (Bound l)) Seq.Empty _
  318. | IntMap.notMember l ren -> pure (succ dom, IntMap.insert l dom ren)
  319. _ -> throwError []
  320. go (_ Seq.:|> _) = throwError []
  321. rename :: HasCallStack => MetaVar -> PartialRen -> Value -> ElabM Term
  322. rename meta pren = go pren where
  323. go :: HasCallStack => PartialRen -> Value -> ElabM Term
  324. go pren (VGlued (HMeta m) sp _)
  325. | m == meta = throwError []
  326. | otherwise = goSp pren (Meta m) sp
  327. go pren (VGlued (HVar (Bound m)) sp _) =
  328. case IntMap.lookup m (sub pren) of
  329. Just v -> goSp pren (Bv (lvl2Ix (dom pren) v)) sp
  330. Nothing -> throwError []
  331. go pren (VGlued h sp _) = goHead h >>= \h -> goSp pren h sp where
  332. goHead HRefl = pure Refl
  333. goHead HCong = pure Cong
  334. goHead HCoe = pure Coe
  335. goHead HSym = pure Sym
  336. go pren (VPi p t d r) = Pi p t <$> go pren d <*> go (liftRen pren) (r $$ vVar (Bound (unLvl (rng pren))))
  337. go pren (VLam p t x) = Lam p t <$> go (liftRen pren) (x $$ vVar (Bound (unLvl (rng pren))))
  338. go _ VType = pure Type
  339. go _ VTop = pure Top
  340. go _ VUnit = pure Unit
  341. go pren (VSigma t d r) = Sigma t <$> go pren d <*> go (liftRen pren) (r $$ vVar (Bound (unLvl (rng pren))))
  342. go pren (VPair a b) = Pair <$> go pren a <*> go pren b
  343. go pren (VProj1 a) = Proj1 <$> go pren a
  344. go pren (VProj2 a) = Proj2 <$> go pren a
  345. go pren (VEq a b c) = Id <$> go pren a <*> go pren b <*> go pren c
  346. go pren (VEqG _ _ _ d) = go pren d
  347. -- go pren x = error (show x)
  348. goSp _ t Seq.Empty = pure t
  349. goSp pren t (sp Seq.:|> AppEx tm) = App Ex <$> goSp pren t sp <*> go pren tm
  350. goSp pren t (sp Seq.:|> AppIm tm) = App Im <$> goSp pren t sp <*> go pren tm
  351. goSp pren t (sp Seq.:|> SProj1) = Proj1 <$> goSp pren t sp
  352. goSp pren t (sp Seq.:|> SProj2) = Proj2 <$> goSp pren t sp