funcons-values 0.1.0.3 → 0.1.0.5
raw patch · 9 files changed
+78/−101 lines, 9 filesdep −random-stringsdep ~containersPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: random-strings
Dependency ranges changed: containers
API changes (from Hackage documentation)
- Funcons.Operations: ASTs :: Types t
- Funcons.Operations: GroundValues :: Types t
- Funcons.Operations: Strings :: Types t
- Funcons.Operations: TagName :: Name -> [Values t] -> TaggedSyntax t
- Funcons.Operations: TagType :: (Types t) -> (Values t) -> TaggedSyntax t
- Funcons.Operations: VMeta :: (TaggedSyntax t) -> Values t
- Funcons.Operations: data TaggedSyntax t
- Funcons.Operations: ppTaggedSyntax :: HasValues t => (t -> String) -> TaggedSyntax t -> String
- Funcons.Operations: structTSMcompare :: (HasValues b1, HasValues b2, Monoid m) => b1 -> b2 -> Maybe m -> [b1] -> [b2] -> Maybe m -> TaggedSyntax b1 -> TaggedSyntax b2 -> Maybe Maybe m
- Funcons.Operations: traverseTSM :: (Ord b, Monad m, HasValues a, HasValues b) => a -> m b -> [a] -> m [b] -> TaggedSyntax a -> m TaggedSyntax b
- Funcons.Operations: vmapTS :: (Ord b) => (a -> b) -> TaggedSyntax a -> TaggedSyntax b
+ Funcons.Operations: ValSeq :: [t] -> Values t
+ Funcons.Operations: empty_type :: HasValues t => OpExpr t
+ Funcons.Operations: empty_type_ :: HasValues t => [OpExpr t] -> OpExpr t
+ Funcons.Operations: integers_from :: HasValues t => OpExpr t -> OpExpr t
+ Funcons.Operations: integers_from_ :: HasValues t => [OpExpr t] -> OpExpr t
+ Funcons.Operations: integers_up_to :: HasValues t => OpExpr t -> OpExpr t
+ Funcons.Operations: integers_up_to_ :: HasValues t => [OpExpr t] -> OpExpr t
+ Funcons.Operations: isGround :: HasValues t => Values t -> Bool
+ Funcons.Operations: multi :: HasValues t => [t] -> Values t
+ Funcons.Operations: multi_ :: HasValues t => [Values t] -> Values t
+ Funcons.Operations: vector :: HasValues t => [Values t] -> Values t
- Funcons.Operations: AnnotatedType :: (Types t) -> SeqSortOp -> Types t
+ Funcons.Operations: AnnotatedType :: Types t -> SeqSortOp -> Types t
- Funcons.Operations: BinaryExpr :: (BinaryExpr t) -> ValueOp t
+ Funcons.Operations: BinaryExpr :: BinaryExpr t -> ValueOp t
- Funcons.Operations: BinaryOp :: OP -> (BinaryOp t) -> (OpExpr t) -> (OpExpr t) -> OpExpr t
+ Funcons.Operations: BinaryOp :: OP -> BinaryOp t -> OpExpr t -> OpExpr t -> OpExpr t
- Funcons.Operations: Complement :: (Types t) -> Types t
+ Funcons.Operations: Complement :: Types t -> Types t
- Funcons.Operations: ComputationType :: (ComputationTypes t) -> Values t
+ Funcons.Operations: ComputationType :: ComputationTypes t -> Values t
- Funcons.Operations: ComputesFromType :: (Types t) -> (Types t) -> ComputationTypes t
+ Funcons.Operations: ComputesFromType :: Types t -> Types t -> ComputationTypes t
- Funcons.Operations: ComputesType :: (Types t) -> ComputationTypes t
+ Funcons.Operations: ComputesType :: Types t -> ComputationTypes t
- Funcons.Operations: Error :: (OpExpr t) -> (Result t) -> EvalResult t
+ Funcons.Operations: Error :: OpExpr t -> Result t -> EvalResult t
- Funcons.Operations: Intersection :: (Types t) -> (Types t) -> Types t
+ Funcons.Operations: Intersection :: Types t -> Types t -> Types t
- Funcons.Operations: Map :: (ValueMaps (Values t)) -> Values t
+ Funcons.Operations: Map :: ValueMaps (Values t) -> Values t
- Funcons.Operations: Multiset :: (MultiSet (Values t)) -> Values t
+ Funcons.Operations: Multiset :: MultiSet (Values t) -> Values t
- Funcons.Operations: NaryExpr :: (NaryExpr t) -> ValueOp t
+ Funcons.Operations: NaryExpr :: NaryExpr t -> ValueOp t
- Funcons.Operations: NaryOp :: OP -> (NaryOp t) -> [OpExpr t] -> OpExpr t
+ Funcons.Operations: NaryOp :: OP -> NaryOp t -> [OpExpr t] -> OpExpr t
- Funcons.Operations: NullaryExpr :: (NullaryExpr t) -> ValueOp t
+ Funcons.Operations: NullaryExpr :: NullaryExpr t -> ValueOp t
- Funcons.Operations: NullaryOp :: OP -> (NullaryOp t) -> OpExpr t
+ Funcons.Operations: NullaryOp :: OP -> NullaryOp t -> OpExpr t
- Funcons.Operations: RewritesTo :: OP -> (OpExpr t) -> [OpExpr t] -> OpExpr t
+ Funcons.Operations: RewritesTo :: OP -> OpExpr t -> [OpExpr t] -> OpExpr t
- Funcons.Operations: Set :: (ValueSets (Values t)) -> Values t
+ Funcons.Operations: Set :: ValueSets (Values t) -> Values t
- Funcons.Operations: TernaryExpr :: (TernaryExpr t) -> ValueOp t
+ Funcons.Operations: TernaryExpr :: TernaryExpr t -> ValueOp t
- Funcons.Operations: TernaryOp :: OP -> (TernaryOp t) -> (OpExpr t) -> (OpExpr t) -> (OpExpr t) -> OpExpr t
+ Funcons.Operations: TernaryOp :: OP -> TernaryOp t -> OpExpr t -> OpExpr t -> OpExpr t -> OpExpr t
- Funcons.Operations: Type :: (Types t) -> ComputationTypes t
+ Funcons.Operations: Type :: Types t -> ComputationTypes t
- Funcons.Operations: UnaryExpr :: (UnaryExpr t) -> ValueOp t
+ Funcons.Operations: UnaryExpr :: UnaryExpr t -> ValueOp t
- Funcons.Operations: UnaryOp :: OP -> (UnaryOp t) -> (OpExpr t) -> OpExpr t
+ Funcons.Operations: UnaryOp :: OP -> UnaryOp t -> OpExpr t -> OpExpr t
- Funcons.Operations: Union :: (Types t) -> (Types t) -> Types t
+ Funcons.Operations: Union :: Types t -> Types t -> Types t
- Funcons.Operations: ValExpr :: (Values t) -> OpExpr t
+ Funcons.Operations: ValExpr :: Values t -> OpExpr t
- Funcons.Operations: Vector :: (ValueVectors (Values t)) -> Values t
+ Funcons.Operations: Vector :: ValueVectors (Values t) -> Values t
- Funcons.Operations: frombool :: (Values t) -> Maybe Bool
+ Funcons.Operations: frombool :: Values t -> Maybe Bool
- Funcons.Operations: structCTMcompare :: (Monoid m, HasValues a, HasValues b) => (a -> b -> Maybe m) -> ([a] -> [b] -> Maybe m) -> ComputationTypes a -> ComputationTypes b -> (Maybe (Maybe m))
+ Funcons.Operations: structCTMcompare :: (Monoid m, HasValues a, HasValues b) => (a -> b -> Maybe m) -> ([a] -> [b] -> Maybe m) -> ComputationTypes a -> ComputationTypes b -> Maybe (Maybe m)
- Funcons.Operations: toMap :: () => Values t -> ValueMaps Values t
+ Funcons.Operations: toMap :: () => Values t -> ValueMaps (Values t)
- Funcons.Operations: traverseCTM :: (Ord b, Monad m, HasValues a, HasValues b) => a -> m b -> [a] -> m [b] -> ComputationTypes a -> m ComputationTypes b
+ Funcons.Operations: traverseCTM :: (Ord b, Monad m, HasValues a, HasValues b) => (a -> m b) -> ([a] -> m [b]) -> ComputationTypes a -> m (ComputationTypes b)
- Funcons.Operations: vmap :: (Ord b) => (a -> b) -> Values a -> Values b
+ Funcons.Operations: vmap :: Ord b => (a -> b) -> Values a -> Values b
Files
- funcons-values.cabal +1/−2
- src/Funcons/Operations.hs +1/−1
- src/Funcons/Operations/Characters.hs +2/−2
- src/Funcons/Operations/Integers.hs +22/−0
- src/Funcons/Operations/Maps.hs +3/−6
- src/Funcons/Operations/Sets.hs +2/−4
- src/Funcons/Operations/Strings.hs +6/−4
- src/Funcons/Operations/Types.hs +13/−13
- src/Funcons/Operations/Values.hs +28/−69
funcons-values.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: funcons-values-version: 0.1.0.3+version: 0.1.0.5 synopsis: Library providing values and operations on values in a fixed universe. description: The PLanCompS project (<http://plancomps.org>) has developed a component-based approach to formal semantics.@@ -53,7 +53,6 @@ ,bv >=0.5 ,multiset >=0.3 && <0.4 ,text >=1.2 && <1.3- ,random-strings hs-source-dirs: src default-language: Haskell2010 ghc-options: -fwarn-incomplete-patterns -fwarn-monomorphism-restriction -fwarn-unused-imports
src/Funcons/Operations.hs view
@@ -25,7 +25,7 @@ import Funcons.Operations.Expr import Funcons.Operations.Libraries -import Funcons.Operations.Values hiding (showArgs, isGround, set_)+import Funcons.Operations.Values hiding (showArgs, set_) import Funcons.Operations.Eval hiding (showArgs) import Funcons.Operations.Atoms hiding (library) import qualified Funcons.Operations.Atoms (library)
src/Funcons/Operations/Characters.hs view
@@ -29,8 +29,8 @@ ascii_character_ = unaryOp ascii_character ascii_character :: HasValues t => OpExpr t -> OpExpr t ascii_character = vUnaryOp "ascii-character" op- where op v | isString_ v, s <- unString v, length s == 1 - = Normal $ inject $ Ascii $ head s+ where op v | isString_ v, [c] <- unString v+ = Normal $ inject $ Ascii c | otherwise = SortErr "ascii-character not applied to a string (of 1 ascii character long)" unicode_ :: HasValues t => [OpExpr t] -> OpExpr t
src/Funcons/Operations/Integers.hs view
@@ -9,13 +9,20 @@ library :: HasValues t => Library t library = libFromList [ ("integers", NullaryExpr integers)+ , ("integers-from", UnaryExpr integers_from)+ , ("from", UnaryExpr integers_from)+ , ("integers-up-to", UnaryExpr integers_up_to)+ , ("up-to", UnaryExpr integers_up_to) , ("is-integer", UnaryExpr is_integer) , ("is-int", UnaryExpr is_integer)+ , ("int-add", NaryExpr integer_add_) , ("integer-add", NaryExpr integer_add_)+ , ("int-sub", BinaryExpr integer_subtract) , ("integer-subtract", BinaryExpr integer_subtract) , ("integer-sub", BinaryExpr integer_subtract) , ("integer-modulo", BinaryExpr stepMod) , ("integer-mod", BinaryExpr stepMod)+ , ("int-mod", BinaryExpr stepMod) , ("integer-multiply", NaryExpr integer_multiply_) , ("int-mul", NaryExpr integer_multiply_) , ("integer-divide", BinaryExpr integer_divide)@@ -30,6 +37,7 @@ , ("decimal-natural", UnaryExpr decimal_natural) , ("natural-predecessor", UnaryExpr natural_predecessor) , ("nat-pred", UnaryExpr natural_predecessor)+ , ("natural-successor", UnaryExpr natural_successor) , ("nat-successor", UnaryExpr natural_successor) , ("nat-succ", UnaryExpr natural_successor) , ("integer-is-less", BinaryExpr is_less)@@ -57,6 +65,20 @@ integers_ = nullaryOp integers integers :: HasValues t => OpExpr t integers = vNullaryOp "integers" (Normal $ injectT Integers)++integers_from_ :: HasValues t => [OpExpr t] -> OpExpr t+integers_from_ = unaryOp integers_from+integers_from :: HasValues t => OpExpr t -> OpExpr t+integers_from = vUnaryOp "integers-from" op+ where op v | Int i <- upcastIntegers v = Normal $ injectT $ IntegersFrom i+ | otherwise = SortErr "integers-from not applied to an integer"++integers_up_to_ :: HasValues t => [OpExpr t] -> OpExpr t+integers_up_to_ = unaryOp integers_up_to+integers_up_to :: HasValues t => OpExpr t -> OpExpr t+integers_up_to = vUnaryOp "integers-up-to" op+ where op v | Int i <- upcastIntegers v = Normal $ injectT $ IntegersUpTo i+ | otherwise = SortErr "integers-up-to not applied to an integer" is_integer_ :: HasValues t => [OpExpr t] -> OpExpr t is_integer_ = unaryOp is_integer
src/Funcons/Operations/Maps.hs view
@@ -33,7 +33,7 @@ map_ = vNaryOp "map" op where op vs | areBindings, allDistinct = Normal $ inject $ Map $ M.fromListWith const assocs | not (areBindings) = SortErr "map not applied to pairs"- | otherwise = Normal $ inject null__ + | otherwise = Normal $ inject null_value__ where areBindings = all isBinding vs where isBinding (ADTVal "tuple" (k:vs)) | Just _ <- project k@@ -84,10 +84,7 @@ map_lookup :: (HasValues t, Ord t) => OpExpr t -> OpExpr t -> OpExpr t map_lookup = vBinaryOp "map-lookup" op where op xv k = case xv of - Map m -> case M.lookup k m of - Nothing -> Normal $ inject $ list [] - Just [ADTVal "no-value" []] -> Normal $ inject $ list []- Just vs -> Normal $ inject $ list vs+ Map m -> Normal $ inject $ multi_ $ maybe [] id $ M.lookup k m _ -> SortErr "map-lookup(M,V) not applied to a map and a value" map_delete_ :: (HasValues t, Ord t) => [OpExpr t] -> OpExpr t@@ -138,6 +135,6 @@ map_elements_ = unaryOp map_elements map_elements :: (Ord t, HasValues t) => OpExpr t -> OpExpr t map_elements = vUnaryOp "map-elements" op- where op (Map m) = Normal $ inject $ ADTVal "list" (map inject $ M.foldrWithKey combine [] m)+ where op (Map m) = Normal $ inject $ multi $ map inject $ M.foldrWithKey combine [] m where combine k vs ls = ADTVal "tuple" (inject k : map inject vs):ls op _ = SortErr "map-elements not applied to a map"
src/Funcons/Operations/Sets.hs view
@@ -7,7 +7,6 @@ import qualified Data.Set as S -import Test.RandomStrings (randomString', randomASCII) import System.IO.Unsafe (unsafePerformIO) library :: (HasValues t, Ord t) => Library t@@ -55,7 +54,7 @@ set_elements_ = unaryOp set_elements set_elements :: HasValues t => OpExpr t -> OpExpr t set_elements = vUnaryOp "set-elements" op- where op (Set s) = Normal $ inject $ ADTVal "list" (map inject $ S.toList s)+ where op (Set s) = Normal $ inject $ multi $map inject $ S.toList s op _ = SortErr "set-elements not applied to a set" set_size_ :: (Ord t, HasValues t) => [OpExpr t] -> OpExpr t@@ -125,7 +124,6 @@ where op (ComputationType (Type ty)) (Set set) = case ty of Atoms -> Normal $ inject $ head atoms _ -> error "missing case for `element-not-in`"- where getRnd = randomString' randomASCII 1 1 5- atoms = dropWhile (flip S.member set) $ + where atoms = dropWhile (flip S.member set) $ map (Atom . ("@" ++) . show) [1..] op _ _ = SortErr "element-not-in not applied to a type and a set"
src/Funcons/Operations/Strings.hs view
@@ -6,6 +6,8 @@ import Funcons.Operations.Internal import Funcons.Operations.Types +import Data.String+ library :: HasValues t => Library t library = libFromList [ ("is-string", UnaryExpr is_string)@@ -15,16 +17,17 @@ is_string_ :: HasValues t => [OpExpr t] -> OpExpr t is_string_ = unaryOp is_string-is_string x = RewritesTo "is-string" (type_member x (ValExpr (ComputationType (Type Strings)))) [x]+is_string x = RewritesTo "is-string" (type_member x (ValExpr (ComputationType (Type (ADT "strings" []))))) [x] to_string_ :: HasValues t => [OpExpr t] -> OpExpr t to_string_ = unaryOp to_string to_string :: HasValues t => OpExpr t -> OpExpr t to_string = vUnaryOp "to-string" stepTo_String -stepTo_String s | isString_ s = Normal $ inject $ s+stepTo_String s | isString_ s = Normal $ inject $ s stepTo_String (Rational r) = mk_string (show (fromRational r)) stepTo_String (Ascii c) = mk_string ([c])+stepTo_String (Char c) = mk_string ([c]) stepTo_String (Atom s) = mk_string s stepTo_String (Int i) = mk_string (show i) stepTo_String (Nat n) = mk_string (show n)@@ -34,8 +37,7 @@ stepTo_String (ADTVal "true" []) = mk_string "true" stepTo_String (ADTVal "false"[]) = mk_string "false" stepTo_String (ADTVal "null"[]) = mk_string "null"-stepTo_String v | isString_ v = mk_string (unString v) stepTo_String v = DomErr ("to-string undefined on this type") mk_string :: HasValues t => String -> Result t-mk_string = Normal . inject . ADTVal "list" . map (inject . Ascii)+mk_string = Normal . inject . fromString
src/Funcons/Operations/Types.hs view
@@ -19,6 +19,7 @@ library = libFromList [ ("types", NullaryExpr types) , ("value-types", NullaryExpr value_types)+ , ("empty-type", NullaryExpr empty_type) -- , ("null-type", NullaryExpr nulltype) -- , ("null", NullaryExpr null) , ("values", NullaryExpr values)@@ -38,7 +39,7 @@ ground_values_ :: HasValues t => [OpExpr t] -> OpExpr t ground_values_ = nullaryOp ground_values ground_values :: HasValues t => OpExpr t-ground_values = vNullaryOp "ground-values" (Normal $ injectT GroundValues)+ground_values = vNullaryOp "ground-values" (Normal $ injectT (ADT "ground-values" [])) types_ :: HasValues t => [OpExpr t] -> OpExpr t types_ = nullaryOp types@@ -46,10 +47,15 @@ types = NullaryOp "types" (Normal $ injectT Types) value_types_ :: HasValues t => [OpExpr t] -> OpExpr t-value_types_ = nullaryOp types+value_types_ = nullaryOp value_types value_types :: HasValues t => OpExpr t value_types = NullaryOp "value-types" (Normal $ injectT Types) +empty_type_ :: HasValues t => [OpExpr t] -> OpExpr t+empty_type_ = nullaryOp empty_type+empty_type :: HasValues t => OpExpr t+empty_type = NullaryOp "empty-types" (Normal $ injectT EmptyType)+ nulltype_ :: HasValues t => [OpExpr t] -> OpExpr t nulltype_ = nullaryOp nulltype nulltype :: HasValues t => OpExpr t@@ -102,7 +108,7 @@ tyOf (Vector v) | V.null v = vectors Values | otherwise = vectors (tyOf (v V.! 0)) tyOf VAny = Values-tyOf (VMeta t) = ASTs+tyOf (ValSeq ts) = Values type_member_ :: HasValues t => [OpExpr t] -> OpExpr t type_member_ = binaryOp type_member@@ -123,25 +129,20 @@ isInType :: HasValues t => Values t -> Types t -> Maybe Bool isInType _ EmptyType = return False isInType v Values = return True --(not (isNull v)) ---isInType n NullType = return (isNull n) -isInType v GroundValues = return (isGround v)+isInType n NullType = return (isNull n) +isInType v (ADT "ground-values" []) = return (isGround v) isInType v (ADT "strings" []) = return (isString_ v) isInType (ADTVal "list" vs') (ADT "lists" [ty']) | Just ty <- projectT ty', Just vs <- sequence (map project vs') = and <$> mapM (flip isInType ty) vs-isInType (ADTVal "true" []) (ADT "booleans" []) = return True-isInType (ADTVal "false" []) (ADT "booleans" []) = return True-isInType v (ADT "tuples" ttparams') - | Just ttparams <- sequence (map projectT ttparams') = case v of- ADTVal "tuple" vs' | Just vs <- sequence (map project vs')- -> isInTupleType vs ttparams- _ -> isInTupleType [v] ttparams + isInType v (ADT nm tys) = Nothing isInType (ADTVal _ _) ADTs = return True isInType (Atom _) Atoms = return True isInType (Ascii _) Characters = return True isInType (Char _) Characters = return True isInType (Ascii _) AsciiCharacters = return True+isInType (Char _) AsciiCharacters = return True isInType (Bit bv) (Bits n) = return (BV.size bv == n) isInType v (IntegersFrom n) | Int i <- upcastIntegers v = return (i >= n)@@ -160,7 +161,6 @@ isInType v (Union ty1 ty2) = (||) <$> isInType v ty1 <*> isInType v ty2 isInType v (Complement ty) = not <$> isInType v ty isInType v (Intersection ty1 ty2) = (&&) <$> isInType v ty1 <*> isInType v ty2-isInType (VMeta _) ASTs = return True -- for meta-programming (see Funcons.MetaProgramming) isInType _ _ = return False isInTupleType :: HasValues t => [Values t] -> [Types t] -> Maybe Bool
src/Funcons/Operations/Values.hs view
@@ -41,9 +41,9 @@ | Rational Rational | Set (ValueSets (Values t)) | Vector (ValueVectors (Values t))- | VMeta (TaggedSyntax t) | VAny -- used whenever funcon terms may have holes in them -- currently only the case in "downwards" flowing signals+ | ValSeq [t] -- represents a multitude of values deriving (Eq,Ord,Show,Read) tuple :: HasValues t => [Values t] -> Values t@@ -52,13 +52,18 @@ list :: HasValues t => [Values t] -> Values t list = ADTVal "list" . map inject -instance HasValues t => IsString (Values t) where- fromString = ADTVal "list" . map (inject . Ascii)+vector :: HasValues t => [Values t] -> Values t+vector = ADTVal "vector" . map inject -data TaggedSyntax t = TagName Name [Values t]- | TagType (Types t) (Values t)- deriving (Eq, Ord, Show, Read)+multi :: HasValues t => [t] -> Values t +multi = ValSeq +multi_ :: HasValues t => [Values t] -> Values t+multi_ = multi . map inject++instance HasValues t => IsString (Values t) where+ fromString = ADTVal "list" . map (inject . Char)+ type ValueMaps t = M.Map t [t] type ValueSets t = S.Set t type ValueVectors t = V.Vector t@@ -88,20 +93,16 @@ | Complement (Types t) | ComputationTypes | EmptyType- | GroundValues | IEEEFloats IEEEFormats | Integers | Intersection (Types t) (Types t) | Naturals | NullType | Rationals- | Strings | Types | UnicodeCharacters | Union (Types t) (Types t) | Values- -- extension for meta-programming (see Funcons.MetaProgramming)- | ASTs deriving (Ord,Eq,Show,Read) sets :: HasValues t => Types t -> Types t@@ -159,14 +160,10 @@ Nat n -> Nat n Rational r -> Rational r Vector v -> Vector $ V.map (vmap f) v- VMeta ts -> VMeta $ vmapTS f ts- VAny -> VAny+ VAny -> VAny + ValSeq ts -> ValSeq (map f ts) -vmapTS :: (Ord b) => (a -> b) -> TaggedSyntax a -> TaggedSyntax b-vmapTS f ts = case ts of- TagName nm vs -> TagName nm (map (vmap f) vs)- TagType t v -> TagType (fmap f t) (vmap f v) - + traverseV :: (Ord b, Monad m, HasValues a, HasValues b) => (a -> m b) -> Values a -> m (Values b) traverseV f = traverseVM f (mapM f)@@ -194,8 +191,8 @@ Nat n -> return $ Nat n Rational r -> return $ Rational r Vector v -> return . Vector . V.fromList . map (fromJust . project) =<< fs (map inject $ V.toList v)- VMeta ts -> VMeta <$> traverseTSM f fs ts VAny -> return VAny+ ValSeq ts -> ValSeq <$> fs ts traverseT :: (Ord b, Monad m, HasValues a, HasValues b) => (a -> m b) -> Types a -> m (Types b)@@ -208,12 +205,10 @@ AsciiCharacters -> return AsciiCharacters Atoms -> return Atoms AnnotatedType ty op -> AnnotatedType <$> traverseTM f fs ty <*> return op- ASTs -> return ASTs Bits i -> return (Bits i) Characters -> return Characters ComputationTypes -> return ComputationTypes Complement t -> Complement <$> traverseTM f fs t - GroundValues -> return GroundValues IntegersFrom f -> return (IntegersFrom f) IntegersUpTo f -> return (IntegersUpTo f) Intersection t1 t2 -> Intersection <$> traverseTM f fs t1 <*> traverseTM f fs t2@@ -223,16 +218,11 @@ Integers -> return Integers Naturals -> return Naturals Rationals -> return Rationals- Strings -> return Strings Types -> return Types UnicodeCharacters -> return UnicodeCharacters Union t1 t2 -> Union <$> traverseTM f fs t1 <*> traverseTM f fs t2 Values -> return Values -traverseTSM f fs t = case t of- TagName nm vs -> TagName nm <$> traverse (traverseVM f fs) vs- TagType ty v -> TagType <$> traverseTM f fs ty <*> traverseVM f fs v- traverseCTM f fs t = case t of Type t -> Type <$> traverseTM f fs t ComputesType t -> ComputesType <$> traverseTM f fs t@@ -316,20 +306,11 @@ (VAny, VAny) -> Just (Just mempty) (_, VAny) -> Nothing (VAny, _) -> Nothing- (VMeta ts, VMeta ts') -> structTSMcompare comp comps ts ts' - (VMeta _, _) -> Nothing- (_, VMeta _) -> Nothing+ (ValSeq ts, ValSeq ts') -> Just (comps ts ts')+ (ValSeq _, _) -> Nothing+ (_, ValSeq _) -> Nothing where comps' xs ys = comps (map inject xs) (map inject ys) -structTSMcompare comp comps ts ts' = case (ts,ts') of- (TagName nm vs, TagName nm' vs') | nm == nm' -> - Just $ comps (map inject vs) (map inject vs') - (TagName _ _, _) -> Nothing- (_, TagName _ _) -> Nothing- (TagType ty v, TagType ty' v') -> - liftM2 (liftM2 mappend) (structTMcompare comp comps ty ty')- (structVMcompare comp comps v v')- structTMcompare :: (Monoid m, HasValues a, HasValues b) => (a -> b -> Maybe m) -> ([a] -> [b] -> Maybe m) -> Types a -> Types b -> Maybe (Maybe m)@@ -346,9 +327,6 @@ (AsciiCharacters, AsciiCharacters) -> Just (Just mempty) (AsciiCharacters, _) -> Nothing (_, AsciiCharacters) -> Nothing- (ASTs, ASTs) -> Just (Just mempty)- (_, ASTs) -> Nothing- (ASTs, _) -> Nothing (AnnotatedType t1 op1, AnnotatedType t2 op2) | op1 == op2 -> structTMcompare comp comps t1 t2 (AnnotatedType _ _, _) -> Nothing (_, AnnotatedType _ _) -> Nothing@@ -364,9 +342,6 @@ (ComputationTypes, ComputationTypes)-> Just (Just mempty) (_, ComputationTypes) -> Nothing (ComputationTypes, _) -> Nothing- (GroundValues, GroundValues) -> Just (Just mempty)- (GroundValues, _) -> Nothing- (_, GroundValues) -> Nothing (IntegersFrom mx, IntegersFrom mx') | mx == mx' -> Just (Just mempty) (IntegersFrom _, _) -> Nothing (_, IntegersFrom _) -> Nothing@@ -394,9 +369,6 @@ (Rationals, Rationals) -> Just (Just mempty) (Rationals, _) -> Nothing (_, Rationals) -> Nothing- (Strings, Strings) -> Just (Just mempty) - (_, Strings) -> Nothing- (Strings, _) -> Nothing (Types, Types) -> Just (Just mempty) (_, Types) -> Nothing (Types, _) -> Nothing@@ -415,11 +387,9 @@ AsciiCharacters -> AsciiCharacters Atoms -> Atoms AnnotatedType ty op -> AnnotatedType (fmap f ty) op- ASTs -> ASTs Bits n -> Bits n Complement t1 -> Complement (fmap f t1) ComputationTypes -> ComputationTypes- GroundValues -> GroundValues IntegersFrom p -> IntegersFrom p IntegersUpTo p -> IntegersUpTo p Characters -> Characters @@ -430,7 +400,6 @@ Naturals -> Naturals NullType -> NullType Rationals -> Rationals- Strings -> Strings Types -> Types UnicodeCharacters -> UnicodeCharacters Union t1 t2 -> Union (fmap f t1) (fmap f t2)@@ -448,13 +417,11 @@ ADTs -> mempty AsciiCharacters -> mempty Atoms -> mempty- ASTs -> mempty AnnotatedType ty op -> foldMap f ty Bits _ -> mempty Characters -> mempty Complement t1 -> foldMap f t1 ComputationTypes -> mempty- GroundValues -> mempty IntegersUpTo q -> mempty IntegersFrom q -> mempty Intersection t1 t2 -> foldMap f t1 `mappend` foldMap f t2@@ -464,7 +431,6 @@ Naturals -> mempty NullType -> mempty Rationals -> mempty- Strings -> mempty Types -> mempty UnicodeCharacters -> mempty Union t1 t2 -> foldMap f t1 `mappend` foldMap f t2@@ -477,12 +443,10 @@ AsciiCharacters -> pure AsciiCharacters AnnotatedType ty op -> AnnotatedType <$> traverse f ty <*> pure op Atoms -> pure Atoms- ASTs -> pure ASTs Bits n -> pure $ Bits n Characters -> pure Characters Complement t -> Complement <$> traverse f t ComputationTypes -> pure ComputationTypes- GroundValues -> pure GroundValues IntegersFrom n -> pure $ IntegersFrom n IntegersUpTo n -> pure $ IntegersUpTo n EmptyType -> pure EmptyType@@ -492,7 +456,6 @@ Naturals -> pure Naturals NullType -> pure NullType Rationals -> pure Rationals- Strings -> pure Strings Types -> pure Types UnicodeCharacters -> pure UnicodeCharacters Union t1 t2 -> Union <$> traverse f t1 <*> traverse f t2@@ -577,8 +540,8 @@ isGround (Rational _) = True isGround (Set s) = all isGround (S.toList s) isGround (Vector v) = all isGround (V.toList v)-isGround (VMeta _) = True isGround VAny = False+isGround (ValSeq ts) = all (maybe False isGround . project) ts -- functions that check simple properties of funcons -- TODO: Some of these are used, and all are exported by Funcons.EDSL@@ -597,7 +560,7 @@ isSet ((Set _)) = True isSet _ = False isString_ :: HasValues t => Values t -> Bool-isString_ (ADTVal "list" vs) = not (null vs) && all (maybe False isAscii) (map project vs)+isString_ (ADTVal "list" vs) = not (null vs) && all (maybe False (isChar . upcastUnicode)) (map project vs) isString_ _ = False isType (ComputationType _) = True isType _ = False@@ -606,7 +569,8 @@ unString :: HasValues t => Values t -> String unString (ADTVal "list" vs) - | Just vs' <- sequence (map project vs), all isAscii vs' = map (\(Ascii c) -> c) vs'+ | Just vs' <- sequence (map (fmap upcastUnicode . project) vs)+ , all isChar vs' = map (\(Char c) -> c) vs' unString _ = error "unString" null__ :: Values t@@ -617,6 +581,7 @@ isNull :: Values t -> Bool isNull (ADTVal "null" _) = True+isNull (ADTVal "null-value" _) = True isNull _ = False isDefinedVal :: Values t -> Bool@@ -645,19 +610,16 @@ ppValues showT (Nat f) = show f ppValues showT (Map m) = if M.null m then "map-empty" else "{" ++ key_values ++ "}"- where key_values = intercalate ", " (map (\(k,v) -> - ppValues showT k++" |-> "++ - showArgs (map (ppValues showT) v)) $ M.toList m)+ where key_values = intercalate ", " (map showKP $ M.assocs m)+ where showKP (k,vs) = ppValues showT k ++ " |-> " ++ + case vs of [v] -> ppValues showT v+ _ -> showArgs (map (ppValues showT) vs) ppValues showT (Multiset s) = "{" ++ showArgs (map (ppValues showT) (MS.toList s)) ++ "}" ppValues showT (Set s) = "{" ++ showArgs (map (ppValues showT) (S.toList s)) ++ "}" ppValues showT (Vector v) = "vector" ++ showArgs (map (ppValues showT) (V.toList v)) ppValues showT (ComputationType ty) = ppComputationTypes showT ty ppValues showT VAny = "_"-ppValues showT (VMeta ts) = ppTaggedSyntax showT ts--ppTaggedSyntax :: HasValues t => (t -> String) -> TaggedSyntax t -> String-ppTaggedSyntax showT (TagName nm vs) = "astv" ++ showArgs (unpack nm : map (ppValues showT) vs)-ppTaggedSyntax showT (TagType ty val) = "astv" ++ showArgs [ppTypes showT ty, ppValues showT val]+ppValues showT (ValSeq ts) = showArgs_ (map showT ts) ppComputationTypes :: HasValues t => (t -> String) -> ComputationTypes t -> String ppComputationTypes showT (Type t) = ppTypes showT t@@ -668,9 +630,7 @@ ppTypes showT (AnnotatedType ty op) = ppTypes showT ty ++ ppOp op ppTypes showT (Complement ty) = "~(" ++ ppTypes showT ty ++ ")" ppTypes showT ComputationTypes = "computation-types"-ppTypes showT GroundValues = "ground-values" ppTypes showT NullType = "null-type"-ppTypes showT ASTs = "asts" ppTypes showT Atoms = "atoms" ppTypes showT AsciiCharacters = "ascii-characters" ppTypes showT Characters = "characters"@@ -680,7 +640,6 @@ ppTypes showT EmptyType = "empty-type" ppTypes showT (UnicodeCharacters) = "unicode-characters" ppTypes showT (Integers) = "integers"-ppTypes showT (Strings) = "strings" ppTypes showT (Values) = "values" ppTypes showT Types = "types" ppTypes showT ADTs = "algebraic-datatypes"