NAME
Language::MuldisD::Core::Functions_Nonscalar - Muldis D general purpose nonscalar functions
VERSION
This document is Language::MuldisD::Core::Functions_Nonscalar version 0.19.1.
PREFACE
This document is part of the Muldis D language specification, whose root document is Language::MuldisD; you should read that root document before you read this one, which provides subservient details. Moreover, you should read the Language::MuldisD::Core document before this current document, as that forms its own tree beneath a root document branch.
DESCRIPTION
This document contains one or more sections that were moved here from Language::MuldisD::Core so that that other document would not be too large.
SYSTEM-DEFINED CORE GENERIC NONSCALAR FUNCTIONS
These functions are applicable to mainly nonscalar types, but are generic in that they typically work with any nonscalar types.
Functions for sys.Core.Tuple.Tuple Having Single Input Tuples
function sys.Core.Tuple.degree result UInt params { topic(Tuple) }-
This function results in the degree of its argument (that is, the count of attributes it has).
function sys.Core.Tuple.attr_from_Tuple result ScaTupRel params { topic(Tuple) }-
This function results in the scalar or nonscalar value of the sole attribute of its argument. This function will fail if its argument is not of degree 1.
function sys.Core.Tuple.Tuple_from_attr result Tuple params { name(Cat.Name), value(ScaTupRel) }-
This function results in the
Tuplevalue which has just one attribute whose name is given bynameand whose value is given byvalue; the attribute's declared type is the same as that ofvalue. function sys.Core.Tuple.attr result ScaTupRel params { topic(Tuple), name(Cat.Name) }-
This function results in the scalar or nonscalar value of the attribute of
topicwhose name is given byname. This function will fail ifnamespecifies an attribute name thattopicdoesn't have. function sys.Core.Tuple.update_attr result Tuple params { topic(Tuple), name(Cat.Name), value(ScaTupRel) }-
This function results in its
topicargument but that its attribute whose name isnamehas been updated with a new scalar or nonscalar value given byvalue. This function will fail ifnamespecifies an attribute name thattopicdoesn't have, or if the declared type ofvalueisn't a subtype of the declared type of the attribute. function sys.Core.Tuple.multi_update result Tuple params { topic(Tuple), attrs(Tuple) }-
This function is like
sys.Core.Tuple.update_attrexcept that it handles N tuple attributes at once rather than just 1. The heading of theattrsargument must be a subset of the heading of thetopicargument; this function's result istopicwith all the attribute values ofattrssubstituted into it. This function could alternately be named sys.Core.Tuple.static_substitution. function sys.Core.Tuple.substitution_in_default result Tuple params { of(Cat.NameChain), subst(Tuple) }-
This function results in the tuple value that is the default value of the tuple data type whose name is given in the
ofargument, but that zero or more of its attribute values have been substituted by values given in thesubstargument. This function is a short-hand forsys.Core.Tuple.multi_updateon the result ofsys.Core.Universal.default. This function will fail if eitherdefaultwould fail for the sameofargument, or if its result isn't a tuple type, or if the heading ofsubstisn't a subset of the heading of the default. The purpose of this function is to support greater brevity in Muldis D coding such that users can define just part of a desired tuple value and have the remainder filled in from defaults for them; particularly useful with tuples that conceptually have some optional attributes. function sys.Core.Tuple.rename result Tuple params { topic(Tuple), map(Cat.AttrRenameMap) }-
This function results in a
Tuplevalue that is the same as itstopicargument but that some of its attributes have different names. Each tuple of the argumentmapspecifies how to rename onetopicattribute, with thebeforeandafterattributes of amaptuple representing the old and new names of atopicattribute, respectively. As a trivial case, this function's result istopicifmaphas no tuples. This function supports renaming attributes to each others' names. This function will fail ifmapspecifies any old names thattopicdoesn't have, or any new names that are the same astopicattributes that aren't being renamed. function sys.Core.Tuple.projection result Tuple params { topic(Tuple), attrs(Cat.SetOfName) }-
This function results in the projection of its
topicargument that has just the subset of attributes oftopicwhich are named in itsattrsargument. As a trivial case, this function's result istopicifattrslists all attributes oftopic; or, it is the nullary tuple ifattrsis empty. This function will fail ifattrsspecifies any attribute names thattopicdoesn't have. function sys.Core.Tuple.cmpl_projection result Tuple params { topic(Tuple), attrs(Cat.SetOfName) }-
This function is the same as
projectionbut that it results in the complementary subset of attributes oftopicwhen given the same arguments. function sys.Core.Tuple.wrap result Tuple params { topic(Tuple), inner(Cat.SetOfName), outer(Cat.Name) }-
This function results in a
Tuplevalue that is the same as itstopicargument but that some of its attributes have been wrapped up into a newTuple-typed attribute, which exists in place of the original attributes. Theinnerargument specifies whichtopicattributes are to be removed and wrapped up, and theouterargument specifies the name of their replacement attribute. As a trivial case, ifinneris empty, then the result has all the same attributes as before plus a new tuple-typed attribute of degree zero; or, ifinnerlists all attributes oftopic, then the result has a single attribute whose value is the same astopic. This function supports the new attribute having the same name as an old one being wrapped into it. This function will fail ifinnerspecifies any attribute names thattopicdoesn't have, or ifouteris the same astopicattributes that aren't being wrapped. function sys.Core.Tuple.cmpl_wrap result Tuple params { topic(Tuple), cmpl_inner(Cat.SetOfName), outer(Cat.Name) }-
This function is the same as
wrapbut that it wraps the complementary subset of attributes oftopicto those specified bycmpl_inner. function sys.Core.Tuple.unwrap result Tuple params { topic(Tuple), outer(Cat.Name) }-
This function is the inverse of
sys.Core.Tuple.wrap, such that it will unwrap aTuple-type attribute into its member attributes. This function will fail ifouterspecifies any attribute name thattopicdoesn't have, or if an attribute oftopic{outer}is the same as anothertopicattribute.
Functions for sys.Core.Tuple.Tuple Having Multiple Input Tuples
function sys.Core.Tuple.product result Tuple params { topic(QuasiSetOfTuple) }-
This function is similar to
sys.Core.Relation.productbut that it works with tuples rather than relations. This function is mainly intended for use in connecting tuples that have all disjoint headings, such as for extending one tuple with additional attributes.
Functions for sys.Core.Relation.Relation Having Single Input Relations
function sys.Core.Relation.degree result UInt params { topic(Relation) }-
This function results in the degree of its argument (that is, the count of attributes it has).
function sys.Core.Relation.cardinality result UInt params { topic(Relation) }-
This function results in the cardinality of its argument (that is, the count of tuples its body has).
function sys.Core.Relation.is_empty result Bool params { topic(Relation) }-
This function results in
Bool:trueiff its argument has zero tuples, andBool:falseotherwise. Note that if you are using aMaybeto represent a sparse data item, analagously to a SQL nullable context, then testing theMaybewithis_emptyis analagous to testing a SQL nullable withis null. function sys.Core.Relation.is_not_empty result Bool params { topic(Relation) }-
This function is exactly the same as
sys.Core.Relation.is_emptyexcept that it results in the opposite boolean value when given the same argument. And following the analogy withis_empty,is_not_emptyis analagous to SQL'sis not null. function sys.Core.Relation.is_member result Bool params { r(Relation), t(Tuple) }-
This function results in
Bool:trueiff itstargument matches a tuple of itsrargument (that is, iff conceptuallytis a member ofr), andBool:falseotherwise. This function is likesys.Core.Relation.is_subsetexcept that the tuple being looked for doesn't have to be wrapped in a relation. This function will fail if the 2 arguments don't have the same heading. function sys.Core.Relation.is_not_member result Bool params { r(Relation), t(Tuple) }-
This function is exactly the same as
sys.Core.Relation.is_memberexcept that it results in the opposite boolean value when given the same arguments. function sys.Core.Relation.Tuple_from_Relation result Tuple params { topic(Relation) }-
This function results in the
Tuplethat is the sole member tuple of its argument. This function will fail if its argument does not have exactly one tuple. function sys.Core.Relation.Relation_from_Tuple result Relation params { topic(Tuple) }-
This function results in the
Relationvalue those body has just the oneTuplethat is its argument. function sys.Core.Relation.insertion result Relation params { r(Relation), t(Tuple) }-
This function results in a
Relationthat is the relational union ofrand a relation whose sole tuple ist; that is, conceptually the result istinserted intor. As a trivial case, iftalready exists inr, then the result is justr. function sys.Core.Relation.disjoint_insertion result Relation params { r(Relation), t(Tuple) }-
This function is exactly the same as
sys.Core.Relation.insertionexcept that it will fail iftalready exists inr. function sys.Core.Relation.deletion result Relation params { r(Relation), t(Tuple) }-
This function results in a
Relationthat is the relational difference fromrof a relation whose sole tuple ist; that is, conceptually the result istdeleted fromr. As a trivial case, iftalready doesn't exist inr, then the result is justr. function sys.Core.Relation.empty result Relation params { topic(Relation) }-
This function results in the empty relation of the same heading of its argument; it has zero tuples.
function sys.Core.Relation.universal result Relation params { topic(Relation) }-
This function results in the universal relation of the same heading of its argument; that is, the relation having all the tuples that could ever exist in a relation with that heading. This function will fail if said universal relation is impossible or impractically large to represent, such as when any attributes are of infinite types.
function sys.Core.Relation.power_set result SetOfRelation params { topic(Relation) }-
This function results in the power set of its argument. The result is a
Setwhose sole attribute isRelation-typed (its type is nominally the same as that of the argument) and which has a tuple for every distinct subset of tuples in the argument. The cardinality of the result is equal to 2 raised to the power of the cardinality of the argument (which may easily lead to a very large result, so use this function with care). Note that the N-ary relational union of the power set of some relation is that relation; the N-ary intersection of any power set is the empty relation. function sys.Core.Relation.negation result Relation params { topic(Relation) }-
This function results in the relational negation/not of its argument. The result relation has the same heading as its argument, and its body contains all of the tuples that are in the universal relation of the same heading and that are not in the argument; that is, the result is the relational difference when the argument is subtracted from said universal relation. This function will fail on any argument that
sys.Core.Relation.universalwould fail on. function sys.Core.Relation.rename result Relation params { topic(Relation), map(Cat.AttrRenameMap) }-
This function is the same as
sys.Core.Tuple.renamebut that it operates on and results in aRelationrather than aTuple. function sys.Core.Relation.projection result Relation params { topic(Relation), attrs(Cat.SetOfName) }-
This function is the same as
sys.Core.Tuple.projectionbut that it operates on and results in aRelationrather than aTuple. But note that the result relation will have fewer tuples thantopicif anytopictuples were non-distinct for just the projected attributes. function sys.Core.Relation.cmpl_projection result Relation params { topic(Relation), attrs(Cat.SetOfName) }-
This function is the same as
sys.Core.Tuple.cmpl_projectionbut that it operates on and results in aRelationrather than aTuple. function sys.Core.Relation.wrap result Relation params { topic(Relation), inner(Cat.SetOfName), outer(Cat.Name) }-
This function is the same as
sys.Core.Tuple.wrapbut that it operates on and results in aRelationrather than aTuple, where each of its member tuples was transformed as persys.Core.Tuple.wrap. function sys.Core.Relation.cmpl_wrap result Relation params { topic(Relation), cmpl_inner(Cat.SetOfName), outer(Cat.Name) }-
This function is the same as
sys.Core.Tuple.cmpl_wrapbut that it operates on and results in aRelationrather than aTuple, where each of its member tuples was transformed as persys.Core.Tuple.cmpl_wrap. function sys.Core.Relation.unwrap result Relation params { topic(Relation), outer(Cat.Name), inner(Cat.SetOfName) }-
This function is the inverse of
sys.Core.Relation.wrapassys.Core.Tuple.unwrapis tosys.Core.Tuple.wrap. But unlike theTuplevariant ofunwrap, this current function requires the extrainnerargument to prevent ambiguity in the general case wheretopicmight have zero tuples, because in that situation the most-specific-type oftopic{outer}would beEmpty, and the names of the attributes to add totopicin place oftopic{outer}are not known. This function will fail iftopichas at least 1 tuple andinnerdoes not match the names of the attributes oftopic{outer}. function sys.Core.Relation.group result Relation params { topic(Relation), inner(Cat.SetOfName), outer(Cat.Name) }-
This function is similar to
sys.Core.Relation.wrapbut that thetopicattribute-wrapping transformations result in newRelation-typed attributes rather than newTuple-typed attributes, and moreover multipletopictuples may be combined into fewer tuples whose newRelation-typed attributes have multiple tuples. This function takes a relation of N tuples and divides the tuples into M groups where all the tuples in a group have the same values in the attributes which aren't being grouped (and distinct values in the attributes that are being grouped); it then results in a new relation of M tuples where the new relation-valued attribute of the result has the tuples of the M groups. A grouped relation contains all of the information in the original relation, but it has less redundancy due to redundant non-grouped attributes now just being represented in one tuple per the multiple tuples whose grouped attributes had them in common. A relation having relation-valued attributes like this is a common way to group so-called child tuples under their parents. As a trivial case, ifinneris empty, then the result has all the same tuples and attributes as before plus a new relation-typed attribute of degree zero whose value per tuple is of cardinality one; or, ifinnerlists all attributes oftopic, then the result has a single tuple of a single attribute whose value is the same astopic. This function supports the new attribute having the same name as an old one being grouped into it. This function will fail ifinnerspecifies any attribute names thattopicdoesn't have, or ifouteris the same astopicattributes that aren't being grouped. function sys.Core.Relation.cmpl_group result Relation params { topic(Relation), group_per(Cat.SetOfName), outer(Cat.Name) }-
This function is the same as
groupbut that it groups the complementary subset of attributes oftopicto those specified bygroup_per. function sys.Core.Relation.ungroup result Relation params { topic(Relation), outer(Cat.Name), inner(Cat.SetOfName) }-
This function is the inverse of
sys.Core.Relation.groupassys.Core.Relation.unwrapis tosys.Core.Relation.wrap; it will ungroup aRelation-type attribute into its member attributes and tuples. A relation can be first grouped and then that result ungrouped to produce the original relation, with no data loss. However, the ungroup of a relation on a relation-valued attribute will lose the information in any outer relation tuples whose inner relation value has zero tuples; a group on this result won't bring them back. This function will fail ifouterspecifies any attribute name thattopicdoesn't have, or if an attribute oftopic{outer}is the same as anothertopicattribute. function sys.Core.Relation.transitive_closure result Relation params { topic(Relation) }-
This function results in the transitive closure of its argument. The argument is a binary relation whose attributes are both of the same declared type, and the result is a relation having the same heading and a body which is a superset of the argument's tuples. Assuming that the argument represents all of the node pairs in a directed graph that have an arc between them, and so each argument tuple represents an arc,
transitive_closurewill determine all of the node pairs in that graph which have a path between them (a recursive operation), so each tuple of the result represents a path. The result is a superset since all arcs are also complete paths. Thetransitive_closurefunction is intended to support recursive queries, such as in connection with the "part explosion problem" (the problem of finding all components, at all levels, of some specified part). function sys.Core.Relation.reduction result Tuple params { topic(Relation), func(Cat.NameChain), assuming(Tuple), identity(Tuple) }-
This function is a generic reduction operator that recursively takes each pair of tuples in
topicand applies an argument-specified tuple value-resulting function (which is both commutative and associative) to the pair until just one input tuple is left, which is the result. The function to apply is named in thefuncargument, and that function must have 3 arguments namedv1,v2,assuming; the last parameter is curried with the same-named argument ofreduction, and the first 2 parameters are the 2 input tuples for an invocation. Iftopichas zero tuples, thenreductionresults in the tuple given inidentity. Note thatidentitymay be changed to take a function name rather than a value, for consistency withfunc. This function will fail if the declared headings ofidentityandtopicaren't compatible. function sys.Core.Relation.maybe_reduction result MaybeOfTuple params { topic(Relation), func(Cat.NameChain), assuming(Tuple) }-
This function is exactly the same as
sys.Core.Relation.reductionexcept that it does not take anassumingargument, and it results in aMaybeof what is otherwise the result type, and that result has zero elements if the argument has zero elements. function sys.Core.Relation.restriction result Relation params { topic(Relation), func(Cat.NameChain), assuming(Tuple) }-
This function results in the relational restriction of its
topicargument as determined by applying theBool-resulting function named in itsfuncargument when the latter function is curried by itsassumingargument. The result relation has the same heading astopic, and its body contains the subset oftopictuples where, for each tuple, the function named byfuncresults inBool:truewhen passed the tuple as itstopicargument andassumingas itsassumingargument. As a trivial case, iffuncis defined to unconditionally result inBool:true, then this function results simply intopic; or, for an unconditionalBool:false, this function results in the empty relation with the same heading. Note that this operation is also legitimately known as where. See also thesys.Core.Relation.semijoinfunction, which is a simpler-syntax alternative forsys.Core.Relation.restrictionin its typical usage where restrictions are composed simply of anded or ored tests for attribute value equality. function sys.Core.Relation.cmpl_restriction result Relation params { topic(Relation), func(Cat.NameChain), assuming(Tuple) }-
This function is the same as
restrictionbut that it results in the complementary subset of tuples oftopicwhen given the same arguments. See also thesys.Core.Relation.semidifferencefunction. function sys.Core.Relation.extension result Relation params { topic(Relation), func(Cat.NameChain), assuming(Tuple) }-
This function results in the relational extension of its
topicargument as determined by applying theTuple-resulting function named in itsfuncargument when the latter function is curried by itsassumingargument. The result relation has a heading that is a superset of that oftopic, and its body contains the same number of tuples, with all attribute values oftopicretained, and possibly extra present, determined as follows; for eachtopictuple, the function named byfuncresults in a second tuple when passed the first tuple as itstopicargument andassumingas itsassumingargument; the first and second tuples must have no attribute names in common, and the result tuple is derived by joining (cross-product) the tuples together. As a trivial case, iffuncis defined to unconditionally result in the degree-zero tuple, then this function results simply intopic. function sys.Core.Relation.static_extension result Relation params { topic(Relation), attrs(Tuple) }-
This function is a simpler-syntax alternative to both
sys.Core.Relation.extensionandsys.Core.Relation.productin the typical scenario of extending a relation, given in thetopicargument, such that every tuple has mutually identical values for each of the new attributes; the new attribute names and common values are given in theattrsargument. function sys.Core.Relation.substitution result Relation params { topic(Relation), func(Cat.NameChain), assuming(Tuple) }-
This function is similar to
extensionexcept that it substitutes values of existing relation attributes rather than adding new attributes. The result relation has the same heading astopic. The result tuple of the function named infuncmust have a heading that is a subset of the heading oftopic; corresponding values resulting from the function named infuncwill replace the values of the tuples oftopic. The result relation has a cardinality that is the same as that oftopic, unless the result of any substitutions was redundant tuples, in which case the result has appropriately fewer tuples. As a trivial case, iffuncis defined to unconditionally result in either the degree-zero tuple or in the same tuple as its owntopicargument, then this function results simply intopic; or, iffuncis defined to have a static result and it replaces all attributes, then this function's result will have just 0..1 tuples. function sys.Core.Relation.static_substitution result Relation params { topic(Relation), attrs(Tuple) }-
This function is a simpler-syntax alternative to
sys.Core.Relation.substitutionin the typical scenario where every tuple of a relation, given in thetopicargument, is updated with identical values for the same attributes; the new attribute values are given in theattrsargument. function sys.Core.Relation.substitution_in_restriction result Relation params { topic(Relation), restr_func(Cat.NameChain), restr_assuming(Tuple), subst_func(Cat.NameChain), subst_assuming(Tuple) }-
This function is like
substitutionexcept that it only transforms a subset of the tuples oftopicrather than all of them. It is a short-hand for first separating the tuples oftopicinto 2 groups where those passed by a relational restriction (defined byrestr_funcandrestr_assuming) are then transformed (defined bysubst_funcandsubst_assuming), then the result of the substitution is unioned with the un-transformed group. See also thesubstitution_in_semijoinfunction, which is a simpler-syntax alternative forsubstitution_in_restrictionin its typical usage where restrictions are composed simply of anded or ored tests for attribute value equality. function sys.Core.Relation.static_substitution_in_restriction result Relation params { topic(Relation), restr_func(Cat.NameChain), restr_assuming(Tuple), subst(Tuple) }-
This function is to
sys.Core.Relation.substitution_in_restrictionwhatsys.Core.Relation.static_substitutionis tosys.Core.Relation.substitution. See also thestatic_substitution_in_semijoinfunction. function sys.Core.Relation.map result Relation params { topic(Relation), func(Cat.NameChain), assuming(Tuple) }-
This function provides a convenient one-place generalization of per-tuple transformations that otherwise might require the chaining of up to a half-dozen other operators like restriction, extension, and rename. This function results in a relation each of whose tuples is the result of applying, to each of the tuples of its
topicargument, theTuple-resulting function named in itsfuncargument when the latter function is curried by itsassumingargument. There is no restriction on what attributes the result tuple offuncmay have (except that all tuples fromfuncmust have compatible headings); this tuple fromfuncwould completely replace the original tuple fromtopic. The result relation has a cardinality that is the same as that oftopic, unless the result offuncwas redundant tuples, in which case the result has appropriately fewer tuples. As a trivial case, iffuncis defined to unconditionally result in the same tuple as its owntopicargument, then this function results simply intopic; or, iffuncis defined to have a static result, then this function's result will have just 0..1 tuples. function sys.Core.Relation.summary result Relation params { topic(Relation), group_per(Cat.SetOfName), summ_func(Cat.NameChain), summ_assuming(Tuple) }-
This function provides a convenient context for using aggregate functions to derive a per-group summary relation, which is its result, from another relation, which is its
topicargument. This function first performs acmpl_groupontopicusinggroup_perto specify which attributes get grouped into a new relation-valued attribute and which don't; those that don't instead get wrapped into a tuple-valued attribute. Then, per tuple in the main relation, this function applies theTuple-resulting function named in itssumm_funcargument when the latter function is curried by itssumm_assumingargument (passed to it as justassuming); the curried function has, rather than the typical 1topicvarying parameter, 2 varying parameters namedsummarizeandper, which are valued with the relation-valued attribute and tuple-valued attribute, respectively. As per a function thatmapapplies, the function named bysumm_funceffectively takes a whole post-grouping input tuple and results in a whole tuple; the applied function would directly invoke any N-ary / aggregate operators, and extract their inputs from (or calculate)summarizeas it sees fit. Note thatsummaryis not intended to be used to summarize an entiretopicrelation at once (except by chance of it resolving to 1 group); you should instead invoke your summarize-allfuncdirectly, or inline it, rather than by way ofsummary, especially if you want a single-tuple result on an emptytopic(whichsummary) won't do.
Functions for sys.Core.Relation.Relation Having Multiple Input Relations
function sys.Core.Relation.is_subset result Bool params { look_in(Relation), look_for(Relation) }-
This function results in
Bool:trueiff the set of tuples comprisinglook_foris a subset of the set of tuples comprisinglook_in, andBool:falseotherwise. This function will fail if the 2 arguments don't have the same heading. function sys.Core.Relation.is_not_subset result Bool params { look_in(Relation), look_for(Relation) }-
This function is exactly the same as
sys.Core.Relation.is_subsetexcept that it results in the opposite boolean value when given the same arguments. function sys.Core.Relation.is_proper_subset result Bool params { look_in(Relation), look_for(Relation) }-
This function is exactly the same as
sys.Core.Relation.is_subsetexcept that it results inBool:falseif its 2 arguments are equal. function sys.Core.Relation.is_not_proper_subset result Bool params { look_in(Relation), look_for(Relation) }-
This function is exactly the same as
sys.Core.Relation.is_proper_subsetexcept that it results in the opposite boolean value when given the same arguments. function sys.Core.Relation.union result Relation params { topic(SetOfRelation) }-
This function results in the relational union/inclusive-or of the N element values of its argument; it is a reduction operator that recursively takes each pair of input values and relationally unions (which is both commutative and associative) them together until just one is left, which is the result. The result relation has the same heading as all of its inputs, and its body contains every tuple that is in any of the input relations. If
topichas zero values, thenunionresults in the empty relation with the same heading, which is the per-distinct-heading identity value for relational union. function sys.Core.Relation.disjoint_union result Relation params { topic(SetOfRelation) }-
This function is exactly the same as
sys.Core.Relation.unionexcept that it will fail if any 2 input values have a tuple in common. function sys.Core.Relation.exclusion result Relation params { topic(BagOfRelation) }-
This function results in the relational exclusion/exclusive-or of the N element values of its argument; it is a reduction operator that recursively takes each pair of input values and relationally excludes (which is both commutative and associative) them together until just one is left, which is the result. The result relation has the same heading as all of its inputs, and its body contains every tuple that is in just an odd number of the input relations. If
topichas zero values, thenexclusionresults in the empty relation with the same heading, which is the per-distinct-heading identity value for relational exclusion. Note that this operation is also legitimately known as symmetric difference. function sys.Core.Relation.intersection result Relation params { topic(SetOfRelation) }-
This function results in the relational intersection/and of the N element values of its argument; it is a reduction operator that recursively takes each pair of input values and relationally intersects (which is both commutative and associative) them together until just one is left, which is the result. The result relation has the same heading as all of its inputs, and its body contains only the tuples that are in every one of the input relations. If
topichas zero values, thenintersectionresults in the universal relation with the same heading (that is, the relation having all the tuples that could ever exist in a relation with that heading), which is the per-distinct-heading identity value for relational intersection. Note that this intersection operator is conceptually a special case ofjoin, applicable when the headings of the inputs are the same, and the other will produce the same result as this when given the same inputs, but with the exception that intersection has a different identity value when given zero inputs. This function will fail on atopicof zero values if the result type's universal relation is impossible or impractically large to represent, such as when any attributes are of infinite types. function sys.Core.Relation.difference result Relation params { source(Relation), filter(Relation) }-
This function results in the relational difference when its
filterargument is subtracted from itssourceargument. The result relation has the same heading as both of its arguments, and its body contains only the tuples that are insourceand are not infilter. This function will fail if its 2 arguments do not have the same heading. Note that this difference operator is conceptually a special case of semidifference, applicable when the headings of the inputs are the same. function sys.Core.Relation.semidifference result Relation params { source(Relation), filter(Relation) }-
This function is the same as
semijoinbut that it results in the complementary subset of tuples ofsourcewhen given the same arguments. Note that this operation is also legitimately known as antijoin or anti-semijoin. function sys.Core.Relation.semijoin result Relation params { source(Relation), filter(Relation) }-
This function results in the relational semijoin of its
sourceandfilterarguments. The result relation has the same heading assource, and its body contains the subset ofsourcetuples that match those offilteras perjoin. Note that relational semijoin is conceptually a short-hand for first doing an ordinary relational join between its 2 arguments, and then performing a relational projection on all of the attributes that justsourcehas. This function will fail any time thatjoinwould fail on the same 2 input relations. function sys.Core.Relation.join result Relation params { topic(QuasiSetOfRelation) }-
This function results in the relational join of the N element values of its argument; it is a reduction operator that recursively takes each pair of input values and relationally joins (which is both commutative and associative) them together until just one is left, which is the result. The result relation has a heading that is a union of all of the headings of its inputs, and its body is the result of first pairwise-matching every tuple of each input relation with every tuple of each other input relation, then where each member of a tuple pair has attribute names in common, eliminating pairs where the values of those attributes differ and unioning the remaining said tuple pairs, then eliminating any result tuples that duplicate others. If
topichas zero values, thenjoinresults in the nullary relation with one tuple, which is the identity value for relational join. As a trivial case, if any input relation has zero tuples, then the function's result will too; or, if any input is the nullary relation with one tuple, that input can be ignored (see identity value); or, if any 2 inputs have no attribute names in common, then the join of just those 2 is a cartesian product; or, if any 2 inputs have all attribute names in common, then the join of just those 2 is an intersection; or, if for 2 inputs, one's set of attribute names is a proper subset of another's, then the join of just those to is a semijoin with the former filtering the latter. This function will fail if any input relations have attributes with common names but different/incompatible declared types. Note that this operation is also legitimately known as natural inner join. function sys.Core.Relation.product result Relation params { topic(QuasiSetOfRelation) }-
This function results in the relational cartesian/cross product of the N element values of its argument; it is conceptually a special case of
joinwhere all input relations have mutually distinct attribute names; unlikejoin,productwill fail if any inputs have attribute names in common. Note that this operation is also legitimately known as cartesian/cross join. function sys.Core.Relation.composition result Relation params { r1(Relation), r2(Relation) }-
This function results in the relational composition of its 2 arguments. It is conceptually a short-hand for first doing an ordinary relational join between its 2 arguments, and then performing a relational projection on all of the attributes that only one of the arguments has; that is, the result has all of and just the attributes that were not involved in matching the tuples of the 2 arguments. This function will fail any time that
joinwould fail on the same 2 input relations. function sys.Core.Relation.quotient result Relation params { dividend(Relation), divisor(Relation) }-
This function results in the quotient when its
dividendargument is divided by itsdivisorargument using relational division. Speaking informally, say the relationsdividendanddivisorare calledAandB, and their attribute sets are respectively named{X,Y}and{Y}, then the result relation has a heading composed of attributes{X}(so the result anddivisorheadings are both complementary subsets of thedividendheading); the result has all tuples{X}such that a tuple{X,Y}appears inAfor all tuples{Y}appearing inB; that is,A / Bis shorthand forA{X} - ((A{X} join B) - A){X}. function sys.Core.Relation.substitution_in_semijoin result Relation params { topic(Relation), restr(Relation), subst_func(Cat.NameChain), subst_assuming(Tuple) }-
This function is like
substitution_in_restrictionexcept that the subset of the tuples oftopicto be transformed is determined by those matched by a semijoin withrestrrather than those that pass a generic relational restriction. function sys.Core.Relation.static_substitution_in_semijoin result Relation params { topic(Relation), restr(Relation), subst(Tuple) }-
This function is to
sys.Core.Relation.substitution_in_semijoinwhatsys.Core.Relation.static_substitutionis tosys.Core.Relation.substitution. function sys.Core.Relation.join_with_group result Relation params { primary(Relation), secondary(Relation), group_attr(Cat.Name) }-
This function is a short-hand for first taking a (natural inner)
joinof itsprimaryandsecondaryarguments, and then taking agroupon all of the attributes that only thesecondaryargument had, such that the attribute resulting from the group has the namegroup_attr. The result has 1 tuple for every tuple ofprimarywhere at least 1 matching tuple exists insecondary. This function will fail ifgroup_attris the same name as any source attribute that wasn't grouped. This function is a convenient tool for gathering both parent and child records from a database using a single query while avoiding duplication of the parent record values. function sys.Core.Relation.outer_join_with_group result Relation params { primary(Relation), secondary(Relation), group_attr(Cat.Name) }-
This function is the same as
sys.Core.Relation.join_with_groupexcept that it results in a half-outer natural join rather than an inner natural join; every tuple ofprimaryhas exactly 1 corresponding tuple in the result, but where there were no matchingsecondarytuples, the result attribute named bygroup_attrcontains zero tuples rather than 1+. function sys.Core.Relation.outer_join_with_maybes result Relation params { primary(Relation), secondary(Relation) }-
This function results in a plain half-outer natural join of its
primaryandsecondaryarguments where all the result attributes that come from justsecondaryareMaybe-typed; for result tuples from matched source tuples, eachsecondaryattribute value is aSingle; for result tuples from non-matchedprimarytuples, eachsecondaryattribute value is aNothing. Theouter_join_with_maybesfunction is Muldis D's answer to the SQL LEFT OUTER JOIN where SQL NULL is implicitly used in result rows that were a non-match. function sys.Core.Relation.outer_join_with_defaults result Relation params { primary(Relation), secondary(Relation) }-
This function is the same as
sys.Core.Relation.outer_join_with_maybesbut thatsecondary-sourced result attributes are not converted toMaybe; rather, for result tuples from non-matches, the declared types of thesecondaryattributes are considered, and the default values of those types are used to fill in missing result values. function sys.Core.Relation.outer_join_with_product result Relation params { primary(Relation), secondary(Relation), filler(Tuple) }-
This function is the same as
sys.Core.Relation.outer_join_with_defaultsbut that missing values are provided explicitly from thefillerargument, which is a tuple whose heading matches the projection ofsecondary's attributes that aren't in common withprimary, and whose body is the literal values to use for those missing attribute values. This function gets its name in that conceptually the result tuples from non-matches are the result of performing a relational cross-product between the un-matchedprimarytuples and the singlefillertuple. This function could alternately be named outer_join_with_static_extension. function sys.Core.Relation.outer_join_with_extension result Relation params { primary(Relation), secondary(Relation), exten_func(Cat.NameChain), exten_assuming(Tuple) }-
This function is the same as
sys.Core.Relation.outer_join_with_productbut that the result tuples from non-matches are the result of performing a relational extension on the un-matchedprimarytuples such that each said result tuple is determined by applying the function named inexten_functo each saidprimarytuple when the named function is curried using theexten_assumingargument.
Functions for sys.Core.Relation.Set
function sys.Core.Set.is_member result Bool params { set(Set), value(ScaTupRel) }-
This function results in
Bool:trueiff itsvalueargument matches the sole attribute of a tuple of itssetargument (that is, iff conceptuallyvalueis a member ofset), andBool:falseotherwise. This function will fail if the declared type ofvalueisn't a subtype of the declared type of the attribute. function sys.Core.Set.is_not_member result Bool params { set(Set), value(ScaTupRel) }-
This function is exactly the same as
sys.Core.Set.is_memberexcept that it results in the opposite boolean value when given the same arguments. function sys.Core.Set.insertion result Set params { set(Set), value(ScaTupRel) }-
This function results in a
Setthat is the relational union ofsetand a Set whose sole tuple has the sole attribute value ofvalue; that is, conceptually the result isvalueinserted intoset. As a trivial case, ifvaluealready exists inset, then the result is justset. function sys.Core.Set.disjoint_insertion result Set params { set(Set), value(ScaTupRel) }-
This function is exactly the same as
sys.Core.Set.insertionexcept that it will fail ifvaluealready exists inset. function sys.Core.Set.deletion result Set params { set(Set), value(ScaTupRel) }-
This function results in a
Setthat is the relational difference fromsetof a Set whose sole tuple has the sole attribute value ofvalue; that is, conceptually the result isvaluedeleted fromset. As a trivial case, ifvaluealready doesn't exist inset, then the result is justset. function sys.Core.Set.reduction result ScaTupRel params { topic(Set), func(Cat.NameChain), assuming(Tuple), identity(ScaTupRel) }-
This function is a generic reduction operator that recursively takes each pair of input values in
topicand applies an argument-specified scalar or nonscalar value-resulting function (which is both commutative and associative) to the pair until just one input value is left, which is the result. The function to apply is named in thefuncargument, and that function must have 3 arguments namedv1,v2,assuming; the last parameter is curried with the same-named argument ofreduction, and the first 2 parameters are the 2 input scalar or nonscalar values for an invocation. Iftopichas zero values, thenreductionresults in the value given inidentity. Note thatidentitymay be changed to take a function name rather than a value, for consistency withfunc. This function will fail if the declared type ofidentityisn't a subtype of the declared type of the sole attribute oftopic. function sys.Core.Set.maybe_reduction result Maybe params { topic(Set), func(Cat.NameChain), assuming(Tuple) }-
This function is exactly the same as
sys.Core.Set.reductionexcept that it does not take anassumingargument, and it results in aMaybeof what is otherwise the result type, and that result has zero elements if the argument has zero elements. function sys.Core.Set.Set_from_wrap result SetOfTuple params { topic(Relation) }-
This function results in a
Setwhose sole attribute is tuple-typed and the attribute values are all the tuples oftopic; is a short-hand for a relational wrap of all attributes oftopicsuch that the new tuple-valued attribute is namedvalue. function sys.Core.Set.Set_from_attr result Set params { topic(Relation), name(Cat.Name) }-
This function results in a
Setconsisting of all the values of the attribute oftopicnamed byname. It is a short-hand for a unary projection of just the named attribute plus its renaming tovalue.
Functions for sys.Core.Relation.Maybe
function sys.Core.Maybe.nothing result Nothing params {}-
This selector function results in the only zero-tuple Maybe value.
function sys.Core.Maybe.single result Single params { value(ScaTupRel) }-
This selector function results in the Maybe value with a single tuple whose
valueattribute's value is thevalueargument. function sys.Core.Maybe.attr result ScaTupRel params { topic(Single) }-
This function results in the scalar or nonscalar value of the sole attribute of the sole tuple of its argument, which always exists when the argument is a
Single. function sys.Core.Maybe.attr_or_default result ScaTupRel params { topic(Maybe) }-
This function results in the scalar or nonscalar value of the sole attribute of the sole tuple of its argument, if said tuple exists; otherwise, it results in the default value of the declared type of the said attribute.
function sys.Core.Maybe.attr_or_value result ScaTupRel params { topic(Maybe), value(ScaTupRel) }-
This function results in the scalar or nonscalar value of the sole attribute of the sole tuple of
topic, if said tuple exists; otherwise, it results invalue. This function will fail if the declared type ofvalueisn't a subtype of the declared type of the attribute.
Functions for sys.Core.Relation.Seq
function sys.Core.Seq.value result ScaTupRel params { topic(Seq), index(UInt) }-
This function results in the scalar or nonscalar
valueattribute of the tuple oftopicwhoseindexattribute isindex. This function will fail if no tuple exists intopicwith the specified index. function sys.Core.Seq.update_value result Seq params { topic(Seq), index(UInt), value(ScaTupRel) }-
This function results in its
topicargument but that thevalueattribute of the tuple oftopicwhoseindexattribute isindexhas been updated with a new scalar or nonscalar value given byvalue. This function will fail if no tuple exists intopicwith the specified index, or if the declared type ofvalueisn't a subtype of the declared type of thevalueattribute. function sys.Core.Seq.insertion result Seq params { topic(Seq), index(UInt), value(ScaTupRel) }-
This function results in its
topicargument but that a new tuple has been inserted whoseindexisindexand whosevalueisvalue; any existing tuples withindexvalues greater than or equal toindexhad theirs incremented by 1. As a trivial case, ifindexis equal to zero or is equal to the cardinality oftopic, thenvaluehas become the new first or last (or only) element, respectively. This function will fail ifindexis greater than the cardinality oftopic, or if the declared type ofvalueisn't a subtype of the declared type of thevalueattribute. function sys.Core.Seq.deletion result Seq params { topic(Seq), index(UInt) }-
This function results in its
topicargument but that a tuple has been deleted whoseindexisindex; any existing tuples withindexvalues greater than or equal toindexhad theirs decremented by 1. This function will fail if no tuple exists intopicwith the specified index. function sys.Core.Seq.is_element result Bool params { topic(Seq), value(ScaTupRel) }-
This function results in
Bool:trueiff itsvalueargument matches thevalueattribute of at least one tuple of itstopicargument (that is, iff conceptuallyvalueis an element oftopic), andBool:falseotherwise. This function will fail if the declared type ofvalueisn't a subtype of the declared type of that attribute. function sys.Core.Seq.is_not_element result Bool params { topic(Seq), value(ScaTupRel) }-
This function is exactly the same as
sys.Core.Seq.is_elementexcept that it results in the opposite boolean value when given the same arguments. function sys.Core.Seq.reduction result ScaTupRel params { topic(Seq), func(Cat.NameChain), assuming(Tuple), identity(ScaTupRel) }-
This function is the same as
sys.Core.Set.reduction, including that input values for the reduction come from thevalueattribute oftopic, except that it works with aSeqrather than aSet. Also, the function named infuncis only associative, and not commutative; the arguments tov1andv2offuncare guaranteed to be consecutive input elements, with the result returning to their place in sequence beween the other input elements. function sys.Core.Seq.maybe_reduction result Maybe params { topic(Seq), func(Cat.NameChain), assuming(Tuple) }-
This function is to
sys.Core.Set.maybe_reductionassys.Core.Seq.reductionis tosys.Core.Set.reduction. function sys.Core.Seq.catenation result Seq params { topic(SeqOfSeq) }-
This function results in the catenation of the N element values of its argument; it is a reduction operator that recursively takes each consecutive pair of input values and catenates (which is associative) them together until just one is left, which is the result. To catenate 2
Seqmeans to union their tuples after first increasing all theindexvalues of the second one by the cardinality of the first one. Iftopichas zero values, thencatenateresults in the empty sequence value, which is the identity value for catenate. function sys.Core.Seq.repeat result Seq params { topic(Seq), count(UInt) }-
This function results in the catenation of
countinstances oftopic. function sys.Core.Seq.reverse result Seq params { topic(Seq) }-
This function results in its argument but that the order of its elements has been reversed. For example, the input
{ 0=>'a', 1=>'b', 2=>'c', 3=>'d'}results in{ 0=>'d', 1=>'c', 2=>'b', 3=>'a' }. function sys.Core.Seq.is_subseq result Bool params { look_in(Seq), look_for(Seq) }-
This function results in
Bool:trueiff the sequence of values comprisinglook_foris a sub-sequence of the sequence of valueslook_in, andBool:falseotherwise. This function will fail if the 2 arguments don't have the same heading. function sys.Core.Seq.is_not_subseq result Bool params { look_in(Seq), look_for(Seq) }-
This function is exactly the same as
sys.Core.Seq.is_subseqexcept that it results in the opposite boolean value when given the same arguments.
Functions for sys.Core.Relation.Bag
function sys.Core.Bag.cardinality result UInt params { topic(Bag) }-
This function is like
sys.Core.Relation.cardinalitybut that it accounts for the greater-than-one multiplicity of values in its argument; it results in the sum of thecountattribute of its argument. function sys.Core.Bag.is_member result Bool params { bag(Bag), value(ScaTupRel) }-
This function is the same as
sys.Core.Set.is_member, including that matching ofvalueis done against thevalueattribute, except that it works with aBagrather than aSet. function sys.Core.Bag.is_not_member result Bool params { bag(Bag), value(ScaTupRel) }-
This function is exactly the same as
sys.Core.Bag.is_memberexcept that it results in the opposite boolean value when given the same arguments. function sys.Core.Bag.count result UInt params { bag(Bag), value(ScaTupRel) }-
This function results in the multiplicity / count of occurrances of
valueinbag; if a tuple exists inbagwhosevalueattribute isvalue, then the result is itscountattribute; otherwise the result is zero. function sys.Core.Bag.insertion result Bag params { bag(Bag), value(ScaTupRel) }-
This function is the same as
sys.Core.Set.insertionas peris_memberbut that its result differs depending on whethervaluealready exists inbag; if it does, then no new tuple is added, but thecountattribute for the matching tuple is incremented by 1; if it does not, then a new tuple is added where itsvalueisvalueand itscountis 1. function sys.Core.Bag.deletion result Bag params { bag(Bag), value(ScaTupRel) }-
This function is the same as
sys.Core.Set.deletionas peris_memberbut that its result differs depending on what thecountfor any tuple matchingvaluethat already exists inbagis; if thecountis greater than 1, then it is decremented by 1; if it is equal to 1, then the tuple whosevalueisvalueis deleted. function sys.Core.Bag.reduction result ScaTupRel params { topic(Bag), func(Cat.NameChain), assuming(Tuple), identity(ScaTupRel) }-
This function is the same as
sys.Core.Set.reduction, including that input values for the reduction come from thevalueattribute oftopic, except that it works with aBagrather than aSet;funcis invoked extra times, where both itsv1andv2arguments might be different instances of the same value having >= 2 multiplicity. function sys.Core.Bag.maybe_reduction result Maybe params { topic(Bag), func(Cat.NameChain), assuming(Tuple) }-
This function is to
sys.Core.Set.maybe_reductionassys.Core.Bag.reductionis tosys.Core.Set.reduction. function sys.Core.Bag.Set_from_Bag result Set params { topic(Bag) }-
This function results in the
Setthat is the projection of thevalueattribute of itsBagargument. function sys.Core.Bag.Bag_from_Set result Bag params { topic(Set) }-
This function results in the
Bagthat is the extension of itsSetargument with a newcountattribute whose value for every tuple is 1. function sys.Core.Bag.Bag_from_wrap result BagOfTuple params { topic(Relation) }-
This function results in a
Bagwhosevalueattribute is tuple-typed and that attribute's values are all the tuples oftopic; is a short-hand for a relational wrap of all attributes oftopicsuch that the new tuple-valued attribute is namedvalue, and then that result is extended with acountattribute whose value for every tuple is 1. function sys.Core.Bag.Bag_from_attr result Bag params { topic(Relation), name(Cat.Name) }-
This function results in a
Bagconsisting of all the values of the attribute oftopicnamed byname. It is a short-hand for first doing a relational group on all attributes oftopicbesidesnameto produce a new relation-typed attribute, and then extending the result of the group with a new positive integer attribute whose values are the cardinality of the relation-valued attribute's values, and then doing a binary projection of the named attribute and the new integer attribute plus their renaming tovalueandcountrespectively. function sys.Core.Bag.is_subset result Bool params { look_in(Bag), look_for(Bag) }-
This function is like
sys.Core.Relation.is_subsetbut that it accounts for the greater-than-one multiplicity of values in its arguments; this function returnsBool:trueiff the multiplicity of eachlook_forvalue is less than or equal to the multiplicity of its counterpartlook_invalue. function sys.Core.Bag.is_not_subset result Bool params { look_in(Bag), look_for(Bag) }-
This function is like
sys.Core.Relation.is_not_subsetas peris_subset. function sys.Core.Bag.is_proper_subset result Bool params { look_in(Bag), look_for(Bag) }-
This function is like
sys.Core.Relation.is_proper_subsetas peris_subset. TODO: What is its definition? function sys.Core.Bag.is_not_proper_subset result Bool params { look_in(Bag), look_for(Bag) }-
This function is like
sys.Core.Relation.is_not_proper_subsetas peris_subset. TODO: What is its definition? function sys.Core.Bag.union result Bag params { topic(SetOfBag) }-
This function is like
sys.Core.Relation.unionbut that it just looks at thevalueattribute of its argument elements when determining what element tuples correspond; then for each tuple in the result, itscountattribute value is the maximum of thecountattribute values of its corresponding input element tuples. function sys.Core.Bag.intersection result Bag params { topic(SetOfBag) }-
This function is like
sys.Core.Relation.intersectionasunionis likesys.Core.Relation.union; the minimum ofcountattribute values is used rather than the maximum. function sys.Core.Bag.difference result Bag params { source(Bag), filter(Bag) }-
This function is like
sys.Core.Relation.differenceasunionis likesys.Core.Relation.union; for corresponding input tuples, the result only has a tuple with the samevalueif thecountof thesourcetuple is greater than thecountof thefiltertuple, and thecountof the result tuple is the difference of those two.
SEE ALSO
Go to Language::MuldisD for the majority of distribution-internal references, and Language::MuldisD::SeeAlso for the majority of distribution-external references.
AUTHOR
Darren Duncan (perl@DarrenDuncan.net)
LICENSE AND COPYRIGHT
This file is part of the formal specification of the Muldis D language.
Muldis D is Copyright © 2002-2008, Darren Duncan.
See the LICENSE AND COPYRIGHT of Language::MuldisD for details.
ACKNOWLEDGEMENTS
The ACKNOWLEDGEMENTS in Language::MuldisD apply to this file too.