diff variant.urs @ 21:e7d64ea0f922

Variant.weaken, mp, and mapR
author Adam Chlipala <adam@chlipala.net>
date Thu, 05 Jan 2012 18:04:04 -0500
parents 296807a9fd50
children ca1c07d49b5e
line wrap: on
line diff
--- a/variant.urs	Mon Jan 02 17:23:31 2012 -0500
+++ b/variant.urs	Thu Jan 05 18:04:04 2012 -0500
@@ -10,6 +10,9 @@
                                                                     -> variant ([nm = t] ++ ts) -> option t
 val testLess : nm :: Name -> t ::: Type -> ts ::: {Type} -> [[nm] ~ ts] => folder ts -> variant ([nm = t] ++ ts) -> option t
 
+val weaken : r1 ::: {Type} -> r2 ::: {Type} -> [r1 ~ r2] => folder r1
+             -> variant r1 -> variant (r1 ++ r2)
+
 val testEq : K --> f :: (K -> Type) -> nm :: Name -> t ::: K -> ts ::: {K} -> r ::: {K} -> [[nm] ~ ts] =>
     Eq.eq r ([nm = t] ++ ts)
     -> folder r
@@ -22,6 +25,8 @@
     -> f t
     -> variant (map f r)
 
+val mp : r ::: {Unit} -> t ::: Type -> folder r -> (variant (mapU {} r) -> t) -> $(mapU t r)
+
 val fold : r ::: {Unit} -> t ::: Type -> folder r -> (variant (mapU {} r) -> t -> t) -> t -> t
 
 val foldR : tr ::: Type -> r ::: {Unit} -> t ::: Type -> folder r -> (variant (mapU {} r) -> tr -> t -> t) -> $(mapU tr r) -> t -> t
@@ -29,6 +34,8 @@
 val appR : m ::: (Type -> Type) -> monad m
            -> tr ::: Type -> r ::: {Unit} -> folder r -> (variant (mapU {} r) -> tr -> m {}) -> $(mapU tr r) -> m {}
 
+val mapR : tr ::: Type -> t ::: Type -> r ::: {Unit} -> folder r -> (variant (mapU {} r) -> tr -> t) -> $(mapU tr r) -> $(mapU t r)
+
 val destrR : K --> f :: (K -> Type) -> fr :: (K -> Type) -> t ::: Type
              -> (p :: K -> f p -> fr p -> t)
              -> r ::: {K} -> folder r -> variant (map f r) -> $(map fr r) -> t