Finished first version
authorSimon Huber <hubsim@gmail.com>
Wed, 3 Jun 2015 14:04:57 +0000 (16:04 +0200)
committerSimon Huber <hubsim@gmail.com>
Wed, 3 Jun 2015 14:04:57 +0000 (16:04 +0200)
Eval.hs
Exp.cf
Resolver.hs
TypeChecker.hs

diff --git a/Eval.hs b/Eval.hs
index eda61acb579a311f4314f85826202e5ab6d80822..5f1078d865a16f6ffa9d78f8444b08f72c9f137b 100644 (file)
--- a/Eval.hs
+++ b/Eval.hs
@@ -431,12 +431,11 @@ comp i a u ts = case a of
           ui1        = comp i a u1 t1s
           comp_u2    = comp i (app f fill_u1) u2 t2s
   VPi{} -> VComp (VPath i a) u (Map.map (VPath i) ts)
-  VU -> undefined
-    -- VComp VU u (Map.map (VPath i) ts)
+  VU -> VComp VU u (Map.map (VPath i) ts)
     -- VGlue u (Map.map (eqToIso i) ts)
   _ | isNeutral w -> w
     where w = VComp a u (Map.map (VPath i) ts)
-  -- VComp VU a es -> compU i a es u ts
+  VComp VU a es -> compU i a es u ts
   VGlue b hisos -> compGlue i b hisos u ts
   -- VGlueLine b phi psi -> compGlueLine i b phi psi u ts
   Ter (Sum _ _ nass) env -> case u of
@@ -519,45 +518,45 @@ unGlue hisos w
        -- VCompElem a es v vs -> unGlue hisos v
        _ -> error $ "unGlue: " ++ show w ++ " should be neutral!"
 
-transGlue :: Name -> Val -> System Val -> Val -> Val
-transGlue i b hisos wi0 = glueElem vi1'' usi1
-  where vi0  = unGlue (hisos `face` (i ~> 0)) wi0 -- in b(i0)
+-- transGlue :: Name -> Val -> System Val -> Val -> Val
+-- transGlue i b hisos wi0 = glueElem vi1'' usi1
+--   where vi0  = unGlue (hisos `face` (i ~> 0)) wi0 -- in b(i0)
 
-        vi1  = trans i b vi0           -- in b(i1)
+--         vi1  = trans i b vi0           -- in b(i1)
 
-        hisosI1 = hisos `face` (i ~> 1)
-        hisos'' =
-          filterWithKey (\alpha _ -> alpha `Map.notMember` hisos) hisosI1
-
-        -- set of elements in hisos independent of i
-        hisos' = filterWithKey (\alpha _ -> i `Map.notMember` alpha) hisos
-
-        us'    = mapWithKey (\gamma isoG ->
-                  transFill i (hisoDom isoG) (wi0 `face` gamma))
-                 hisos'
-        usi1'  = mapWithKey (\gamma isoG ->
-                   trans i (hisoDom isoG) (wi0 `face` gamma))
-                 hisos'
+--         hisosI1 = hisos `face` (i ~> 1)
+--         hisos'' =
+--           filterWithKey (\alpha _ -> alpha `Map.notMember` hisos) hisosI1
 
-        ls'    = mapWithKey (\gamma isoG ->
-                   VPath i $ squeeze i (b `face` gamma)
-                           (hisoFun isoG `app` (us' ! gamma)))
-                 hisos'
-        bi1    = b `face` (i ~> 1)
-        vi1'   = compLine bi1 vi1 ls'
-
-        uls''   = mapWithKey (\gamma isoG ->
-                     gradLemma (bi1 `face` gamma) isoG (usi1' `face` gamma)
-                               (vi1' `face` gamma))
-                   hisos''
-
-        vi1''   = compLine bi1 vi1' (Map.map snd uls'')
-
-        usi1    = mapWithKey (\gamma _ ->
-                    if gamma `Map.member` usi1'
-                       then usi1' ! gamma
-                       else fst (uls'' ! gamma))
-                  hisosI1
+--         -- set of elements in hisos independent of i
+--         hisos' = filterWithKey (\alpha _ -> i `Map.notMember` alpha) hisos
+
+--         us'    = mapWithKey (\gamma isoG ->
+--                   transFill i (hisoDom isoG) (wi0 `face` gamma))
+--                  hisos'
+--         usi1'  = mapWithKey (\gamma isoG ->
+--                    trans i (hisoDom isoG) (wi0 `face` gamma))
+--                  hisos'
+
+--         ls'    = mapWithKey (\gamma isoG ->
+--                    VPath i $ squeeze i (b `face` gamma)
+--                            (hisoFun isoG `app` (us' ! gamma)))
+--                  hisos'
+--         bi1    = b `face` (i ~> 1)
+--         vi1'   = compLine bi1 vi1 ls'
+
+--         uls''   = mapWithKey (\gamma isoG ->
+--                      gradLemma (bi1 `face` gamma) isoG (usi1' `face` gamma)
+--                                (vi1' `face` gamma))
+--                    hisos''
+
+--         vi1''   = compLine bi1 vi1' (Map.map snd uls'')
+
+--         usi1    = mapWithKey (\gamma _ ->
+--                     if gamma `Map.member` usi1'
+--                        then usi1' ! gamma
+--                        else fst (uls'' ! gamma))
+--                   hisosI1
 
 compGlue :: Name -> Val -> System Val -> Val -> System Val -> Val
 compGlue i b hisos wi0 ws = glueElem vi1'' usi1''
@@ -761,6 +760,103 @@ gradLemma b hiso@(VPair a (VPair f (VPair g (VPair s t)))) us v =
 -------------------------------------------------------------------------------
 -- | Composition in the Universe
 
+
+unGlueU :: System Val -> Val -> Val
+unGlueU es w
+    | Map.null es         = w
+    | eps `Map.member` es = transNegLine (es ! eps) w
+    | otherwise           = case w of
+       VGlueElem v us   -> v
+       _ -> error $ "unGlueU: " ++ show w ++ " should be neutral!"
+
+compU :: Name -> Val -> System Val -> Val -> System Val -> Val
+compU i b es wi0 ws = glueElem vi1'' usi1''
+  where bi1 = b `face` (i ~> 1)
+        vs   = mapWithKey
+                 (\alpha wAlpha -> unGlueU (es `face` alpha) wAlpha) ws
+        vsi1 = vs `face` (i ~> 1) -- same as: border vi1 vs
+        vi0  = unGlueU (es `face` (i ~> 0)) wi0 -- in b(i0)
+
+        v    = fill i b vi0 vs           -- in b
+        vi1  = comp i b vi0 vs           -- is v `face` (i ~> 1) in b(i1)
+
+        esI1 = es `face` (i ~> 1)
+        es'  = filterWithKey (\alpha _ -> i `Map.notMember` alpha) es
+        -- es'' = filterWithKey (\alpha _ -> not (alpha `Map.member` es)) esI1
+        es'' = filterWithKey (\alpha _ -> not (alpha `Map.member` es')) esI1
+
+        us'    = mapWithKey (\gamma eGamma ->
+                   fill i (eGamma @@ One) (wi0 `face` gamma) (ws `face` gamma))
+                 es'
+        usi1'  = mapWithKey (\gamma eGamma ->
+                   comp i (eGamma @@ One) (wi0 `face` gamma) (ws `face` gamma))
+                 es'
+
+        ls'    = mapWithKey (\gamma eGamma ->
+                     pathComp i (b `face` gamma) (v `face` gamma)
+                       (transNegLine eGamma (us' ! gamma)) (vs `face` gamma))
+                   es'
+
+        vi1' = compLine (constPath bi1) vi1 (ls' `unionSystem` vsi1)
+
+        wsi1 = ws `face` (i ~> 1)
+
+        -- for gamma in es'', (i1) gamma is in es, so wsi1 gamma
+        -- is in the domain of isoGamma
+        uls'' = mapWithKey (\gamma eGamma ->
+                  gradLemmaU (bi1 `face` gamma) eGamma
+                    ((usi1' `face` gamma) `unionSystem` (wsi1 `face` gamma))
+                    (vi1' `face` gamma))
+                  es''
+
+        vsi1' = border vi1' es'
+
+        vi1'' = compLine (constPath bi1) vi1'
+                  (Map.map snd uls'' `unionSystem` vsi1' `unionSystem` vsi1)
+
+        usi1'' = Map.mapWithKey (\gamma _ ->
+                     if gamma `Map.member` usi1' then usi1' ! gamma
+                     else fst (uls'' ! gamma))
+                   esI1
+
+
+
+-- Grad Lemma, takes a line eq in U, a system us and a value v, s.t. f us =
+-- border v. Outputs (u,p) s.t. border u = us and a path p between v
+-- and f u, where f is transNegLine eq
+gradLemmaU :: Val -> Val -> System Val -> Val -> (Val, Val)
+gradLemmaU b eq us v = (u, VPath i theta'')
+  where i:j:_   = freshs (eq,us,v)
+        a       = eq @@ One
+        g       = transLine
+        f       = transNegLine
+        s e b   = VPath j $ compNeg j (e @@ j) (trans j (e @@ j) b)
+                    (mkSystem [(j ~> 0, transFill j (e @@ j) b)
+                              ,(j ~> 1, transFillNeg j (e @@ j)
+                                          (trans j (e @@ j) b))])
+        t e a   = VPath j $ comp j (e @@ j) (transNeg j (e @@ j) a)
+                    (mkSystem [(j ~> 0, transFill j (e @@ j)
+                                          (transNeg j (e @@ j) a))
+                              ,(j ~> 1, transFillNeg j (e @@ j) a)])
+        gv      = g eq v
+        us'     = mapWithKey (\alpha uAlpha ->
+                                   t (eq `face` alpha) uAlpha @@ i) us
+        theta   = fill i a gv us'
+        u       = comp i a gv us'  -- Same as "theta `face` (i ~> 1)"
+        ws      = insertSystem (i ~> 0) gv $
+                  insertSystem (i ~> 1) (t eq u @@ j) $
+                  mapWithKey
+                    (\alpha uAlpha ->
+                      t (eq `face` alpha) uAlpha @@ (Atom i :/\: Atom j)) us
+        theta'  = compNeg j a theta ws
+        xs      = insertSystem (i ~> 0) (s eq v @@ j) $
+                  insertSystem (i ~> 1) (s eq (f eq u) @@ j) $
+                  mapWithKey
+                    (\alpha uAlpha ->
+                       s (eq `face` alpha) (f (eq `face` alpha) uAlpha) @@ j) us
+        theta'' = comp j b (f eq theta') xs
+
+
 -- isConstPath :: Val -> Bool
 -- isConstPath (VPath i u) = i `notElem` support u
 -- isConstPath _ = False
diff --git a/Exp.cf b/Exp.cf
index 8958783994a44572f72f317d824966e0e5f6cb3a..0b5e55bfa7055111b05baa0028e5b6fd94e7e14a 100644 (file)
--- a/Exp.cf
+++ b/Exp.cf
@@ -34,11 +34,11 @@ IdP.          Exp3 ::= "IdP" Exp4 Exp4 Exp4 ;
 Trans.        Exp3 ::= "transport" Exp4 Exp4 ;
 Comp.         Exp3 ::= "comp" Exp4 Exp4 System ;
 Glue.         Exp3 ::= "glue" Exp4 System ;
-GlueElem.     Exp3 ::= "glueElem" Exp4 System ;
-CompElem.     Exp3 ::= "compElem" Exp4 System Exp4 System ;
-GlueLine.     Exp3 ::= "glueLine" Formula Formula Exp4 ;
-GlueLineElem. Exp3 ::= "glueLineElem" Formula Formula Exp4 ;
-ElimComp.     Exp3 ::= "elimComp" Exp4 System Exp4 ;
+-- GlueElem.     Exp3 ::= "glueElem" Exp4 System ;
+-- CompElem.     Exp3 ::= "compElem" Exp4 System Exp4 System ;
+-- GlueLine.     Exp3 ::= "glueLine" Formula Formula Exp4 ;
+-- GlueLineElem. Exp3 ::= "glueLineElem" Formula Formula Exp4 ;
+-- ElimComp.     Exp3 ::= "elimComp" Exp4 System Exp4 ;
 Fst.          Exp4 ::= Exp4 ".1" ;
 Snd.          Exp4 ::= Exp4 ".2" ;
 Pair.         Exp5 ::= "(" Exp "," [Exp] ")" ;
index a3248e6eeca093663a213bb6a1ea00af9950e86c..56758aca9862381dc8842e1305e8523134ef54d2 100644 (file)
@@ -202,9 +202,10 @@ resolveExp e = case e of
         CTT.PCon (unAIdent n) <$> resolveExp a <*> mapM resolveExp xs
                               <*> mapM resolveFormula phis
       _ -> CTT.AppFormula <$> resolveExp t <*> resolveFormula phi
-  Trans x y   -> CTT.Trans <$> resolveExp x <*> resolveExp y
+  Trans x y   -> CTT.Comp <$> resolveExp x <*> resolveExp y <*> pure Map.empty
   IdP x y z   -> CTT.IdP <$> resolveExp x <*> resolveExp y <*> resolveExp z
-  Comp u v ts -> CTT.Comp <$> resolveExp u <*> resolveExp v <*> resolveSystem ts
+  Comp u v ts -> CTT.Comp <$> (CTT.Path (C.Name "_") <$> resolveExp u)
+                   <*> resolveExp v <*> resolveSystem ts
   Glue u ts   -> do
     rs <- resolveSystem ts
     let isIso (CTT.Pair _ (CTT.Pair _ (CTT.Pair _ (CTT.Pair _ _)))) = True
@@ -212,15 +213,15 @@ resolveExp e = case e of
     unless (all isIso $ Map.elems rs)
       (throwError $ "Not a system of isomorphisms: " ++ show rs)
     CTT.Glue <$> resolveExp u <*> pure rs
-  GlueElem u ts      -> CTT.GlueElem <$> resolveExp u <*> resolveSystem ts
-  GlueLine phi psi u ->
-    CTT.GlueLine <$> resolveExp u <*> resolveFormula phi <*> resolveFormula psi
-  GlueLineElem phi psi u ->
-    CTT.GlueLineElem <$> resolveExp u <*> resolveFormula phi
-      <*> resolveFormula psi
-  CompElem a es t ts -> CTT.CompElem <$> resolveExp a <*> resolveSystem es
-                                     <*> resolveExp t <*> resolveSystem ts
-  ElimComp a es t    -> CTT.ElimComp <$> resolveExp a <*> resolveSystem es <*> resolveExp t
+  -- GlueElem u ts      -> CTT.GlueElem <$> resolveExp u <*> resolveSystem ts
+  -- GlueLine phi psi u ->
+  --   CTT.GlueLine <$> resolveExp u <*> resolveFormula phi <*> resolveFormula psi
+  -- GlueLineElem phi psi u ->
+  --   CTT.GlueLineElem <$> resolveExp u <*> resolveFormula phi
+  --     <*> resolveFormula psi
+  -- CompElem a es t ts -> CTT.CompElem <$> resolveExp a <*> resolveSystem es
+  --                                    <*> resolveExp t <*> resolveSystem ts
+  -- ElimComp a es t    -> CTT.ElimComp <$> resolveExp a <*> resolveSystem es <*> resolveExp t
   _ -> do
     modName <- asks envModule
     throwError ("Could not resolve " ++ show e ++ " in module " ++ modName)
index d70220a0cff6b6a7da312d0865a5ebad7cd16b0a..4eb75e44035a05cf0c5bc0f857bd39a98e5aac0a 100644 (file)
@@ -200,18 +200,18 @@ check a t = case (a,t) of
     check VU a\r
     rho <- asks env\r
     checkGlue (eval rho a) ts\r
-  (VGlue va ts,GlueElem u us) -> do\r
-    check va u\r
-    vu <- evalTyping u\r
-    checkGlueElem vu ts us\r
-  (VU,GlueLine b phi psi) -> do\r
-    check VU b\r
-    checkFormula phi\r
-    checkFormula psi\r
-  (VGlueLine vb phi psi,GlueLineElem r phi' psi') -> do\r
-    check vb r\r
-    unlessM ((phi,psi) === (phi',psi')) $\r
-      throwError "GlueLineElem: formulas don't match"\r
+  -- (VGlue va ts,GlueElem u us) -> do\r
+  --   check va u\r
+  --   vu <- evalTyping u\r
+  --   checkGlueElem vu ts us\r
+  -- (VU,GlueLine b phi psi) -> do\r
+  --   check VU b\r
+  --   checkFormula phi\r
+  --   checkFormula psi\r
+  -- (VGlueLine vb phi psi,GlueLineElem r phi' psi') -> do\r
+  --   check vb r\r
+  --   unlessM ((phi,psi) === (phi',psi')) $\r
+  --     throwError "GlueLineElem: formulas don't match"\r
   _ -> do\r
     v <- infer t\r
     unlessM (v === a) $\r
@@ -355,7 +355,7 @@ checkPathSystem t0 va ps = do
   v <- T.sequence $ mapWithKey (\alpha pAlpha ->\r
     local (faceEnv alpha) $ do\r
       rhoAlpha <- asks env\r
-      (a0,a1)  <- checkPath (constPath (va `face` alpha)) pAlpha\r
+      (a0,a1)  <- checkPath (va `face` alpha) pAlpha\r
       unlessM (a0 === eval rhoAlpha t0) $\r
         throwError $ "Incompatible system with " ++ show t0\r
       return a1) ps\r
@@ -404,41 +404,41 @@ infer e = case e of
     case t of\r
       VIdP a _ _ -> return $ a @@ phi\r
       _ -> throwError (show e ++ " is not a path")\r
-  Trans p t -> do\r
-    (a0,a1) <- checkPath (constPath VU) p\r
-    check a0 t\r
-    return a1\r
+  -- Trans p t -> do\r
+  --   (a0,a1) <- checkPath (constPath VU) p\r
+  --   check a0 t\r
+  --   return a1\r
   Comp a t0 ps -> do\r
-    check VU a\r
+    checkPath (constPath VU) a\r
     va <- evalTyping a\r
-    check va t0\r
+    check (va @@ Zero) t0\r
     checkPathSystem t0 va ps\r
-    return va\r
-  CompElem a es u us -> do\r
-    check VU a\r
-    rho <- asks env\r
-    let va = eval rho a\r
-    ts <- checkPathSystem a VU es\r
-    let ves = evalSystem rho es\r
-    unless (keys es == keys us)\r
-      (throwError ("Keys don't match in " ++ show es ++ " and " ++ show us))\r
-    check va u\r
-    let vu = eval rho u\r
-    checkSystemsWith ts us (const check)\r
-    let vus = evalSystem rho us\r
-    checkCompSystem vus\r
-    checkSystemsWith ves vus (\alpha eA vuA ->\r
-      unlessM (transNegLine eA vuA === (vu `face` alpha)) $\r
-        throwError $ "Malformed compElem: " ++ show us)\r
-    return $ compLine VU va ves\r
-  ElimComp a es u -> do\r
-    check VU a\r
-    rho <- asks env\r
-    let va = eval rho a\r
-    checkPathSystem a VU es\r
-    let ves = evalSystem rho es\r
-    check (compLine VU va ves) u\r
-    return va\r
+    return (va @@ One)\r
+  -- CompElem a es u us -> do\r
+  --   check VU a\r
+  --   rho <- asks env\r
+  --   let va = eval rho a\r
+  --   ts <- checkPathSystem a VU es\r
+  --   let ves = evalSystem rho es\r
+  --   unless (keys es == keys us)\r
+  --     (throwError ("Keys don't match in " ++ show es ++ " and " ++ show us))\r
+  --   check va u\r
+  --   let vu = eval rho u\r
+  --   checkSystemsWith ts us (const check)\r
+  --   let vus = evalSystem rho us\r
+  --   checkCompSystem vus\r
+  --   checkSystemsWith ves vus (\alpha eA vuA ->\r
+  --     unlessM (transNegLine eA vuA === (vu `face` alpha)) $\r
+  --       throwError $ "Malformed compElem: " ++ show us)\r
+  --   return $ compLine VU va ves\r
+  -- ElimComp a es u -> do\r
+  --   check VU a\r
+  --   rho <- asks env\r
+  --   let va = eval rho a\r
+  --   checkPathSystem a VU es\r
+  --   let ves = evalSystem rho es\r
+  --   check (compLine VU va ves) u\r
+  --   return va\r
   PCon c a es phis -> do\r
     check VU a\r
     va <- evalTyping a\r