|  |  | @ -38,8 +38,6 @@ import Syntax | 
			
		
	
		
			
				
					|  |  |  | import System.IO.Unsafe | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | import {-# SOURCE #-} Elab.WiredIn | 
			
		
	
		
			
				
					|  |  |  | import Control.Arrow (second) | 
			
		
	
		
			
				
					|  |  |  | import Debug.Trace | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | eval :: HasCallStack => Term -> ElabM Value | 
			
		
	
		
			
				
					|  |  |  | eval t = asks (flip eval' t) | 
			
		
	
	
		
			
				
					|  |  | @ -179,12 +177,16 @@ eval' e (GlueTy a phi tys f) = glueType (eval' e a) (eval' e phi) (eval' e tys) | 
			
		
	
		
			
				
					|  |  |  | eval' e (Glue a phi tys eqvs t x) = glueElem (eval' e a) (eval' e phi) (eval' e tys) (eval' e eqvs) (eval' e t) (eval' e x) | 
			
		
	
		
			
				
					|  |  |  | eval' e (Unglue a phi tys f x) = unglue (eval' e a) (eval' e phi) (eval' e tys) (eval' e f) (eval' e x) | 
			
		
	
		
			
				
					|  |  |  | eval' e (Let ns x) = | 
			
		
	
		
			
				
					|  |  |  | let env' = foldl (\newe (n, ty, x) -> newe { getEnv = Map.insert n (eval' newe ty, eval' newe x) (getEnv newe) }) e ns | 
			
		
	
		
			
				
					|  |  |  | let env' = foldl (\newe (n, ty, x) -> | 
			
		
	
		
			
				
					|  |  |  | let nft = eval' newe ty | 
			
		
	
		
			
				
					|  |  |  | in newe { getEnv = Map.insert n (nft, evalFix' newe n nft x) (getEnv newe) }) | 
			
		
	
		
			
				
					|  |  |  | e | 
			
		
	
		
			
				
					|  |  |  | ns | 
			
		
	
		
			
				
					|  |  |  | in eval' env' x | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | eval' e (Case range sc xs) = evalCase e (eval' e range @@) (force (eval' e sc)) xs | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalCase :: ElabEnv -> (Value -> Value) -> Value -> [(Term, Term)] -> Value | 
			
		
	
		
			
				
					|  |  |  | evalCase :: ElabEnv -> (Value -> Value) -> Value -> [(Term, Int, Term)] -> Value | 
			
		
	
		
			
				
					|  |  |  | evalCase _ _ sc [] = error $ "unmatched pattern for value: " ++ show (prettyTm (quote sc)) | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalCase env rng (VSystem fs) cases = VSystem (fmap (flip (evalCase env rng) cases) fs) | 
			
		
	
	
		
			
				
					|  |  | @ -195,18 +197,25 @@ evalCase env rng (VHComp a phi u a0) cases = | 
			
		
	
		
			
				
					|  |  |  | where | 
			
		
	
		
			
				
					|  |  |  | v = Elab.WiredIn.fill (fun (const a)) phi u a0 | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalCase env _ sc ((Ref _, k):_) = eval' env k @@ sc | 
			
		
	
		
			
				
					|  |  |  | evalCase env _ sc ((Ref _, _, k):_) = eval' env k @@ sc | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalCase env rng (val@(VNe (HCon _ x) sp)) ((Con x', k):xs) | 
			
		
	
		
			
				
					|  |  |  | evalCase env rng (val@(VNe (HCon _ x) sp)) ((Con x', _, k):xs) | 
			
		
	
		
			
				
					|  |  |  | | x == x'   = foldl applProj (eval' env k) sp | 
			
		
	
		
			
				
					|  |  |  | | otherwise = evalCase env rng val xs | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalCase env rng (val@(VNe (HPCon _ _ x) sp)) ((Con x', k):xs) | 
			
		
	
		
			
				
					|  |  |  | evalCase env rng (val@(VNe (HPCon _ _ x) sp)) ((Con x', _, k):xs) | 
			
		
	
		
			
				
					|  |  |  | | x == x'   = foldl applProj (eval' env k) sp | 
			
		
	
		
			
				
					|  |  |  | | otherwise = evalCase env rng val xs | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalCase env rng sc xs = VCase (getEnv env) (fun rng) sc xs | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalFix' :: ElabEnv -> Name -> NFType -> Term -> Value | 
			
		
	
		
			
				
					|  |  |  | evalFix' env name nft term = fix $ \val -> eval' env{ getEnv = Map.insert name (nft, val) (getEnv env) } term | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | evalFix :: Name -> NFType -> Term -> ElabM Value | 
			
		
	
		
			
				
					|  |  |  | evalFix name nft term = do | 
			
		
	
		
			
				
					|  |  |  | t <- ask | 
			
		
	
		
			
				
					|  |  |  | pure (evalFix' t name nft term) | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | data NotEqual = NotEqual Value Value | 
			
		
	
		
			
				
					|  |  |  | deriving (Show, Typeable, Exception) | 
			
		
	
	
		
			
				
					|  |  | @ -294,8 +303,8 @@ unify' topa topb = join $ go <$> forceIO topa <*> forceIO topb where | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | go (VCase _ _ a b) (VCase _ _ a' b') = do | 
			
		
	
		
			
				
					|  |  |  | unify' a a' | 
			
		
	
		
			
				
					|  |  |  | let go a b = join $ unify' <$> eval (snd a) <*> eval (snd b) | 
			
		
	
		
			
				
					|  |  |  | zipWithM_ go (sortOn fst b) (sortOn fst b') | 
			
		
	
		
			
				
					|  |  |  | let go (_, _, a) (_, _, b) = join $ unify' <$> eval a <*> eval b | 
			
		
	
		
			
				
					|  |  |  | zipWithM_ go (sortOn (\(x, _, _) -> x) b) (sortOn (\(x, _, _) -> x) b') | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | go x y | 
			
		
	
		
			
				
					|  |  |  | | x == y = pure () | 
			
		
	
	
		
			
				
					|  |  | @ -596,7 +605,7 @@ vApp p (VSystem fs) arg = VSystem (fmap (flip (vApp p) arg) fs) | 
			
		
	
		
			
				
					|  |  |  | vApp p (VInc (VPi _ _ (Closure _ r)) phi f) arg = VInc (r (vApp p f arg)) phi (vApp p f arg) | 
			
		
	
		
			
				
					|  |  |  | vApp p (VCase env rng sc branches) arg = | 
			
		
	
		
			
				
					|  |  |  | VCase env (fun \x -> let VPi _ _ (Closure _ r) = rng @@ x in r arg) sc | 
			
		
	
		
			
				
					|  |  |  | (map (second (projIntoCase (flip (App p) (quote arg)))) branches) | 
			
		
	
		
			
				
					|  |  |  | (map (projIntoCase (flip (App p) (quote arg))) branches) | 
			
		
	
		
			
				
					|  |  |  | vApp _ x _             = error $ "can't apply " ++ show (prettyTm (quote x)) | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | (@@) :: HasCallStack => Value -> Value -> Value | 
			
		
	
	
		
			
				
					|  |  | @ -610,7 +619,7 @@ vProj1 (GluedVl h sp vl) = GluedVl h (sp Seq.:|> PProj1) (vProj1 vl) | 
			
		
	
		
			
				
					|  |  |  | vProj1 (VSystem fs) = VSystem (fmap vProj1 fs) | 
			
		
	
		
			
				
					|  |  |  | vProj1 (VInc (VSigma a _) b c) = VInc a b (vProj1 c) | 
			
		
	
		
			
				
					|  |  |  | vProj1 (VCase env rng sc branches) = | 
			
		
	
		
			
				
					|  |  |  | VCase env (fun \x -> let VSigma a _ = rng @@ x in a) sc (map (second (projIntoCase Proj1)) branches) | 
			
		
	
		
			
				
					|  |  |  | VCase env rng sc (map (projIntoCase Proj1) branches) | 
			
		
	
		
			
				
					|  |  |  | vProj1 x = error $ "can't proj1 " ++ show (prettyTm (quote x)) | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | vProj2 :: HasCallStack => Value -> Value | 
			
		
	
	
		
			
				
					|  |  | @ -620,10 +629,12 @@ vProj2 (GluedVl h sp vl) = GluedVl h (sp Seq.:|> PProj2) (vProj2 vl) | 
			
		
	
		
			
				
					|  |  |  | vProj2 (VSystem fs) = VSystem (fmap vProj2 fs) | 
			
		
	
		
			
				
					|  |  |  | vProj2 (VInc (VSigma _ (Closure _ r)) b c) = VInc (r (vProj1 c)) b (vProj2 c) | 
			
		
	
		
			
				
					|  |  |  | vProj2 (VCase env rng sc branches) = | 
			
		
	
		
			
				
					|  |  |  | VCase env (fun \x -> let VSigma _ (Closure _ r) = rng @@ x in r (vProj1 x)) sc (map (second (projIntoCase Proj2)) branches) | 
			
		
	
		
			
				
					|  |  |  | VCase env rng sc (map (projIntoCase Proj2) branches) | 
			
		
	
		
			
				
					|  |  |  | vProj2 x = error $ "can't proj2 " ++ show (prettyTm (quote x)) | 
			
		
	
		
			
				
					|  |  |  |  | 
			
		
	
		
			
				
					|  |  |  | projIntoCase :: (Term -> Term) -> Term -> Term | 
			
		
	
		
			
				
					|  |  |  | projIntoCase f (Lam p x r) = Lam p x (projIntoCase f r) | 
			
		
	
		
			
				
					|  |  |  | projIntoCase f (PathIntro l a b r) = PathIntro l a b (projIntoCase f r) | 
			
		
	
		
			
				
					|  |  |  | projIntoCase f x = f x | 
			
		
	
		
			
				
					|  |  |  | projIntoCase :: (Term -> Term) -> (Term, Int, Term) -> (Term, Int, Term) | 
			
		
	
		
			
				
					|  |  |  | projIntoCase fun (pat, nLams, term) = (pat, nLams, go nLams term) where | 
			
		
	
		
			
				
					|  |  |  | go 0 x = fun x | 
			
		
	
		
			
				
					|  |  |  | go n (Lam p x r) = Lam p x (go (n - 1) r) | 
			
		
	
		
			
				
					|  |  |  | go n (PathIntro l a b r) = PathIntro l a b (go (n - 1) r) | 
			
		
	
		
			
				
					|  |  |  | go _ x = x |