Interval

Overview

Another kind of structure commonly needed in rich data is the interval. The definition of the Interval<T> class here is an intensional one, i.e. it states its members by implication from its limits, rather than enumerating them. To support the common need for defining times in models that could be either a fixed point in time or a time interval, the classes Point_interval<T> and Proper_interval<T> are provided. If Interval<X> is defined as the type of feature in a class in an openEHR model, where X is some descendant of Ordered, then at runtime, either a Point_interval or Proper_interval may be attached.

In addition to the generic interval types, the derived types Multiplicity_interval and Cardinality are provided, for use in models to represent multiplicity, optionality, and cardinality.

The following UML diagram illustrates the interval package.

BASE foundation types.interval
Figure 1. base.foundation_types.interval package

Class Definitions

Interval Class

  • Definition

  • Effective

  • BMM

  • UML

Class

Interval<T> (abstract)

Description

Interval abstraction, featuring upper and lower limits that may be open or closed, included or not included.

Inherit

Any

Attributes

Signature

Meaning

0..1

lower: T

Lower bound.

0..1

upper: T

Upper bound.

1..1

lower_unbounded: Boolean

True if lower boundary open (i.e. = -infinity).

1..1

upper_unbounded: Boolean

True if upper boundary open (i.e. = +infinity).

1..1

lower_included: Boolean

True if lower boundary value included in range, if not lower_unbounded.

1..1

upper_included: Boolean

True if upper boundary value included in range if not upper_unbounded.

Functions

Signature

Meaning

1..1
(abstract)

has (
e: T[1]
): Boolean

Post_result: Result = (lower_unbounded or lower_included and v >= lower) or v > lower and (upper_unbounded or upper_included and v <= upper or v < upper)

True if the value e is properly contained in this Interval.

1..1
(abstract)

intersects (
other: Interval[1]
): Boolean

True if there is any overlap between intervals represented by Current and other. True if at least one limit of other is strictly inside the limits of this interval.

1..1
(abstract)

contains (
other: Interval[1]
): Boolean

True if current interval properly contains other? True if all points of other are inside the current interval.

1..1
(abstract)

is_equal (
other: Any[1]
): Boolean

True if current object’s interval is semantically same as other.

Invariants

Lower_included_valid: lower_unbounded implies not lower_included

Upper_included_valid: upper_unbounded implies not upper_included

Limits_consistent: (not upper_unbounded and not lower_unbounded) implies lower <= upper

Limits_comparable: (not upper_unbounded and not lower_unbounded) implies lower.strictly_comparable_to (upper)

Interval<T> (abstract)

Interval abstraction, featuring upper and lower limits that may be open or closed, included or not included.

Inherits: Any

Attributes

lower: T [0..1]

Lower bound.

upper: T [0..1]

Upper bound.

lower_unbounded: Boolean [1..1]

True if lower boundary open (i.e. = -infinity).

upper_unbounded: Boolean [1..1]

True if upper boundary open (i.e. = +infinity).

lower_included: Boolean [1..1]

True if lower boundary value included in range, if not lower_unbounded.

upper_included: Boolean [1..1]

True if upper boundary value included in range if not upper_unbounded.

Functions

(abstract) is_equal (
other: Any[1]
): Boolean [1..1]

True if current object’s interval is semantically same as other.

Any.equal alias "=", "==" (
other: Any[1]
): Boolean [1..1]

Reference equality for reference types, value equality for value types.

Parameters
other

Other object for comparison.

Any.instance_of (
a_type: String[1]
): Any [1..1]

Create new instance of a type.

Any.type_of (
an_object: Any[1]
): String [1..1]

Type name of an object as a string. May include generic parameters, as in "Interval<Time>".

Any.not_equal alias "!=", "≠" (
other: Ordered[1]
): Boolean [1..1]

True if current object not equal to other. Returns not equal().

(abstract) has (
e: T[1]
): Boolean

Post_result: Result = (lower_unbounded or lower_included and v >= lower) or v > lower and (upper_unbounded or upper_included and v <= upper or v < upper) [1..1]

True if the value e is properly contained in this Interval.

(abstract) intersects (
other: Interval[1]
): Boolean [1..1]

True if there is any overlap between intervals represented by Current and other. True if at least one limit of other is strictly inside the limits of this interval.

(abstract) contains (
other: Interval[1]
): Boolean [1..1]

True if current interval properly contains other? True if all points of other are inside the current interval.

Invariants

Lower_included_valid: lower_unbounded implies not lower_included

Upper_included_valid: upper_unbounded implies not upper_included

Limits_consistent: (not upper_unbounded and not lower_unbounded) implies lower <= upper

Limits_comparable: (not upper_unbounded and not lower_unbounded) implies lower.strictly_comparable_to (upper)

{
    "name": "Interval",
    "documentation": "Interval abstraction, featuring upper and lower limits that may be open or closed, included or not included.",
    "is_abstract": true,
    "ancestors": [
        "Any"
    ],
    "generic_parameter_defs": {
        "T": {
            "name": "T",
            "conforms_to_type": "Ordered"
        }
    },
    "properties": {
        "lower": {
            "_type": "P_BMM_SINGLE_PROPERTY_OPEN",
            "name": "lower",
            "documentation": "Lower bound.",
            "type": "T"
        },
        "upper": {
            "_type": "P_BMM_SINGLE_PROPERTY_OPEN",
            "name": "upper",
            "documentation": "Upper bound.",
            "type": "T"
        },
        "lower_unbounded": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "lower_unbounded",
            "documentation": "True if `_lower_` boundary open (i.e. = `-infinity`).",
            "is_mandatory": true,
            "type": "Boolean"
        },
        "upper_unbounded": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "upper_unbounded",
            "documentation": "True if `_upper_` boundary open (i.e. = `+infinity`).",
            "is_mandatory": true,
            "type": "Boolean"
        },
        "lower_included": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "lower_included",
            "documentation": "True if `_lower_` boundary value included in range, if `not _lower_unbounded_`.",
            "is_mandatory": true,
            "type": "Boolean"
        },
        "upper_included": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "upper_included",
            "documentation": "True if `_upper_` boundary value included in range if `not _upper_unbounded_`.",
            "is_mandatory": true,
            "type": "Boolean"
        }
    },
    "functions": {
        "has": {
            "name": "has",
            "documentation": "True if the value `e` is properly contained in this Interval.",
            "is_abstract": true,
            "parameters": {
                "e": {
                    "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER_OPEN",
                    "name": "e",
                    "type": "T"
                }
            },
            "post_conditions": {
                "Post_result": "Result = (lower_unbounded or lower_included and v >= lower) or v > lower and (upper_unbounded or upper_included and v <= upper or v < upper)"
            },
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "intersects": {
            "name": "intersects",
            "documentation": "True if there is any overlap between intervals represented by Current and `_other_`. True if at least one limit of `_other_` is strictly inside the limits of this interval.",
            "is_abstract": true,
            "parameters": {
                "other": {
                    "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                    "name": "other",
                    "type": "Interval"
                }
            },
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "contains": {
            "name": "contains",
            "documentation": "True if current interval properly contains `_other_`? True if all points of `_other_` are inside the current interval.",
            "is_abstract": true,
            "parameters": {
                "other": {
                    "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                    "name": "other",
                    "type": "Interval"
                }
            },
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "is_equal": {
            "name": "is_equal",
            "documentation": "True if current object's interval is semantically same as `_other_`.",
            "is_abstract": true,
            "parameters": {
                "other": {
                    "_type": "P_BMM_SINGLE_FUNCTION_PARAMETER",
                    "name": "other",
                    "type": "Any"
                }
            },
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        }
    },
    "invariants": {
        "Lower_included_valid": "lower_unbounded implies not lower_included",
        "Upper_included_valid": "upper_unbounded implies not upper_included",
        "Limits_consistent": "(not upper_unbounded and not lower_unbounded) implies lower <= upper",
        "Limits_comparable": "(not upper_unbounded and not lower_unbounded) implies lower.strictly_comparable_to (upper)"
    }
}
Interval

Point_interval Class

  • Definition

  • Effective

  • BMM

  • UML

Class

Point_interval<T>

Description

Type representing an Interval that happens to be a point value. Provides an efficient representation that is substitutable for Interval<T> where needed.

Inherit

Interval

Attributes

Signature

Meaning

1..1
(effected)

lower_unbounded: Boolean
{default = false}

Lower boundary open (i.e. = -infinity).

1..1
(effected)

upper_unbounded: Boolean
{default = false}

Upper boundary open (i.e. = +infinity).

1..1
(effected)

lower_included: Boolean
{default = true}

Lower boundary value included in range if not lower_unbounded.

1..1
(effected)

upper_included: Boolean
{default = true}

Upper boundary value included in range if not upper_unbounded.

Invariants

Inv_point: lower = upper

Point_interval<T>

Type representing an Interval that happens to be a point value. Provides an efficient representation that is substitutable for Interval<T> where needed.

Inherits: Any, Interval

Attributes

Interval.lower: T [0..1]

Lower bound.

Interval.upper: T [0..1]

Upper bound.

lower_unbounded: Boolean [1..1]
{default = false}

Lower boundary open (i.e. = -infinity).

upper_unbounded: Boolean [1..1]
{default = false}

Upper boundary open (i.e. = +infinity).

lower_included: Boolean [1..1]
{default = true}

Lower boundary value included in range if not lower_unbounded.

upper_included: Boolean [1..1]
{default = true}

Upper boundary value included in range if not upper_unbounded.

Functions

(abstract) Interval.is_equal (
other: Any[1]
): Boolean [1..1]

True if current object’s interval is semantically same as other.

Any.equal alias "=", "==" (
other: Any[1]
): Boolean [1..1]

Reference equality for reference types, value equality for value types.

Parameters
other

Other object for comparison.

Any.instance_of (
a_type: String[1]
): Any [1..1]

Create new instance of a type.

Any.type_of (
an_object: Any[1]
): String [1..1]

Type name of an object as a string. May include generic parameters, as in "Interval<Time>".

Any.not_equal alias "!=", "≠" (
other: Ordered[1]
): Boolean [1..1]

True if current object not equal to other. Returns not equal().

(abstract) Interval.has (
e: T[1]
): Boolean

Post_result: Result = (lower_unbounded or lower_included and v >= lower) or v > lower and (upper_unbounded or upper_included and v <= upper or v < upper) [1..1]

True if the value e is properly contained in this Interval.

(abstract) Interval.intersects (
other: Interval[1]
): Boolean [1..1]

True if there is any overlap between intervals represented by Current and other. True if at least one limit of other is strictly inside the limits of this interval.

(abstract) Interval.contains (
other: Interval[1]
): Boolean [1..1]

True if current interval properly contains other? True if all points of other are inside the current interval.

Invariants

Interval.Lower_included_valid: lower_unbounded implies not lower_included

Interval.Upper_included_valid: upper_unbounded implies not upper_included

Interval.Limits_consistent: (not upper_unbounded and not lower_unbounded) implies lower <= upper

Interval.Limits_comparable: (not upper_unbounded and not lower_unbounded) implies lower.strictly_comparable_to (upper)

Inv_point: lower = upper

{
    "name": "Point_interval",
    "documentation": "Type representing an Interval that happens to be a point value. Provides an efficient representation that is substitutable for `Interval<T>` where needed.",
    "ancestors": [
        "Interval"
    ],
    "generic_parameter_defs": {
        "T": {
            "name": "T",
            "conforms_to_type": "Ordered"
        }
    },
    "properties": {
        "lower_unbounded": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "lower_unbounded",
            "documentation": "Lower boundary open (i.e. = -infinity).",
            "is_mandatory": true,
            "type": "Boolean",
            "default": false
        },
        "upper_unbounded": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "upper_unbounded",
            "documentation": "Upper boundary open (i.e. = +infinity).",
            "is_mandatory": true,
            "type": "Boolean",
            "default": false
        },
        "lower_included": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "lower_included",
            "documentation": "Lower boundary value included in range if not `_lower_unbounded_`.",
            "is_mandatory": true,
            "type": "Boolean",
            "default": true
        },
        "upper_included": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "upper_included",
            "documentation": "Upper boundary value included in range if not `_upper_unbounded_`.",
            "is_mandatory": true,
            "type": "Boolean",
            "default": true
        }
    },
    "invariants": {
        "Inv_point": "lower = upper"
    }
}
Point_interval

Proper_interval Class

  • Definition

  • Effective

  • BMM

  • UML

Class

Proper_interval<T>

Description

Type representing a 'proper' Interval, i.e. any two-sided or one-sided interval.

Inherit

Interval

Invariants

Inv_not_point: lower /= upper

Proper_interval<T>

Type representing a 'proper' Interval, i.e. any two-sided or one-sided interval.

Inherits: Any, Interval

Attributes

Interval.lower: T [0..1]

Lower bound.

Interval.upper: T [0..1]

Upper bound.

Interval.lower_unbounded: Boolean [1..1]

True if lower boundary open (i.e. = -infinity).

Interval.upper_unbounded: Boolean [1..1]

True if upper boundary open (i.e. = +infinity).

Interval.lower_included: Boolean [1..1]

True if lower boundary value included in range, if not lower_unbounded.

Interval.upper_included: Boolean [1..1]

True if upper boundary value included in range if not upper_unbounded.

Functions

(abstract) Interval.is_equal (
other: Any[1]
): Boolean [1..1]

True if current object’s interval is semantically same as other.

Any.equal alias "=", "==" (
other: Any[1]
): Boolean [1..1]

Reference equality for reference types, value equality for value types.

Parameters
other

Other object for comparison.

Any.instance_of (
a_type: String[1]
): Any [1..1]

Create new instance of a type.

Any.type_of (
an_object: Any[1]
): String [1..1]

Type name of an object as a string. May include generic parameters, as in "Interval<Time>".

Any.not_equal alias "!=", "≠" (
other: Ordered[1]
): Boolean [1..1]

True if current object not equal to other. Returns not equal().

(abstract) Interval.has (
e: T[1]
): Boolean

Post_result: Result = (lower_unbounded or lower_included and v >= lower) or v > lower and (upper_unbounded or upper_included and v <= upper or v < upper) [1..1]

True if the value e is properly contained in this Interval.

(abstract) Interval.intersects (
other: Interval[1]
): Boolean [1..1]

True if there is any overlap between intervals represented by Current and other. True if at least one limit of other is strictly inside the limits of this interval.

(abstract) Interval.contains (
other: Interval[1]
): Boolean [1..1]

True if current interval properly contains other? True if all points of other are inside the current interval.

Invariants

Interval.Lower_included_valid: lower_unbounded implies not lower_included

Interval.Upper_included_valid: upper_unbounded implies not upper_included

Interval.Limits_consistent: (not upper_unbounded and not lower_unbounded) implies lower <= upper

Interval.Limits_comparable: (not upper_unbounded and not lower_unbounded) implies lower.strictly_comparable_to (upper)

Inv_not_point: lower /= upper

{
    "name": "Proper_interval",
    "documentation": "Type representing a 'proper' Interval, i.e. any two-sided or one-sided interval.",
    "ancestors": [
        "Interval"
    ],
    "generic_parameter_defs": {
        "T": {
            "name": "T",
            "conforms_to_type": "Ordered"
        }
    },
    "invariants": {
        "Inv_not_point": "lower /= upper"
    }
}
Proper_interval

Multiplicity_interval Class

  • Definition

  • Effective

  • BMM

  • UML

Class

Multiplicity_interval

Description

An Interval of Integer, used to represent multiplicity, cardinality and optionality in models.

Inherit

Proper_interval

Constants

Signature

Meaning

1..1

Multiplicity_range_marker: String = ".."

Marker to use in string form of interval between limits.

1..1

Multiplicity_unbounded_marker: Character = '*'

Symbol to use to indicate upper limit unbounded.

Functions

Signature

Meaning

1..1

is_open (): Boolean

True if this interval imposes no constraints, i.e. is set to 0..*.

1..1

is_optional (): Boolean

True if this interval expresses optionality, i.e. 0..1.

1..1

is_mandatory (): Boolean

True if this interval expresses mandation, i.e. 1..1.

1..1

is_prohibited (): Boolean

True if this interval is set to 0..0.

Multiplicity_interval

An Interval of Integer, used to represent multiplicity, cardinality and optionality in models.

Inherits: Any, Interval, Proper_interval

Constants

Multiplicity_range_marker: String = ".." [1..1]

Marker to use in string form of interval between limits.

Multiplicity_unbounded_marker: Character = '*' [1..1]

Symbol to use to indicate upper limit unbounded.

Attributes

Interval.lower: T [0..1]

Lower bound.

Interval.upper: T [0..1]

Upper bound.

Interval.lower_unbounded: Boolean [1..1]

True if lower boundary open (i.e. = -infinity).

Interval.upper_unbounded: Boolean [1..1]

True if upper boundary open (i.e. = +infinity).

Interval.lower_included: Boolean [1..1]

True if lower boundary value included in range, if not lower_unbounded.

Interval.upper_included: Boolean [1..1]

True if upper boundary value included in range if not upper_unbounded.

Functions

(abstract) Interval.is_equal (
other: Any[1]
): Boolean [1..1]

True if current object’s interval is semantically same as other.

Any.equal alias "=", "==" (
other: Any[1]
): Boolean [1..1]

Reference equality for reference types, value equality for value types.

Parameters
other

Other object for comparison.

Any.instance_of (
a_type: String[1]
): Any [1..1]

Create new instance of a type.

Any.type_of (
an_object: Any[1]
): String [1..1]

Type name of an object as a string. May include generic parameters, as in "Interval<Time>".

Any.not_equal alias "!=", "≠" (
other: Ordered[1]
): Boolean [1..1]

True if current object not equal to other. Returns not equal().

(abstract) Interval.has (
e: T[1]
): Boolean

Post_result: Result = (lower_unbounded or lower_included and v >= lower) or v > lower and (upper_unbounded or upper_included and v <= upper or v < upper) [1..1]

True if the value e is properly contained in this Interval.

(abstract) Interval.intersects (
other: Interval[1]
): Boolean [1..1]

True if there is any overlap between intervals represented by Current and other. True if at least one limit of other is strictly inside the limits of this interval.

(abstract) Interval.contains (
other: Interval[1]
): Boolean [1..1]

True if current interval properly contains other? True if all points of other are inside the current interval.

is_open (): Boolean [1..1]

True if this interval imposes no constraints, i.e. is set to 0..*.

is_optional (): Boolean [1..1]

True if this interval expresses optionality, i.e. 0..1.

is_mandatory (): Boolean [1..1]

True if this interval expresses mandation, i.e. 1..1.

is_prohibited (): Boolean [1..1]

True if this interval is set to 0..0.

Invariants

Interval.Lower_included_valid: lower_unbounded implies not lower_included

Interval.Upper_included_valid: upper_unbounded implies not upper_included

Interval.Limits_consistent: (not upper_unbounded and not lower_unbounded) implies lower <= upper

Interval.Limits_comparable: (not upper_unbounded and not lower_unbounded) implies lower.strictly_comparable_to (upper)

Proper_interval.Inv_not_point: lower /= upper

{
    "name": "Multiplicity_interval",
    "documentation": "An Interval of Integer, used to represent multiplicity, cardinality and optionality in models. ",
    "ancestors": [
        "Proper_interval"
    ],
    "constants": {
        "Multiplicity_range_marker": {
            "name": "Multiplicity_range_marker",
            "documentation": "Marker to use in string form of interval between limits.",
            "type": "String",
            "value": "\"..\""
        },
        "Multiplicity_unbounded_marker": {
            "name": "Multiplicity_unbounded_marker",
            "documentation": "Symbol to use to indicate upper limit unbounded.",
            "type": "Character",
            "value": "'*'"
        }
    },
    "functions": {
        "is_open": {
            "name": "is_open",
            "documentation": "True if this interval imposes no constraints, i.e. is set to `0..*`.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "is_optional": {
            "name": "is_optional",
            "documentation": "True if this interval expresses optionality, i.e. `0..1`.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "is_mandatory": {
            "name": "is_mandatory",
            "documentation": "True if this interval expresses mandation, i.e. `1..1`.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "is_prohibited": {
            "name": "is_prohibited",
            "documentation": "True if this interval is set to `0..0`.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        }
    }
}
Multiplicity_interval

Cardinality Class

  • Definition

  • Effective

  • BMM

  • UML

Class

Cardinality

Description

Express constraints on the cardinality of container objects which are the values of multiply-valued attributes, including uniqueness and ordering, providing the means to state that a container acts like a logical list, set or bag.

Attributes

Signature

Meaning

1..1

interval: Multiplicity_interval

The interval of this cardinality.

1..1

is_ordered: Boolean

True if the members of the container attribute to which this cardinality refers are ordered.

1..1

is_unique: Boolean

True if the members of the container attribute to which this cardinality refers are unique.

Functions

Signature

Meaning

1..1

is_bag (): Boolean

True if the semantics of this cardinality represent a bag, i.e. unordered, non-unique membership.

1..1

is_list (): Boolean

True if the semantics of this cardinality represent a list, i.e. ordered, non-unique membership.

1..1

is_set (): Boolean

True if the semantics of this cardinality represent a set, i.e. unordered, unique membership.

Cardinality

Express constraints on the cardinality of container objects which are the values of multiply-valued attributes, including uniqueness and ordering, providing the means to state that a container acts like a logical list, set or bag.

Attributes

interval: Multiplicity_interval [1..1]

The interval of this cardinality.

is_ordered: Boolean [1..1]

True if the members of the container attribute to which this cardinality refers are ordered.

is_unique: Boolean [1..1]

True if the members of the container attribute to which this cardinality refers are unique.

Functions

is_bag (): Boolean [1..1]

True if the semantics of this cardinality represent a bag, i.e. unordered, non-unique membership.

is_list (): Boolean [1..1]

True if the semantics of this cardinality represent a list, i.e. ordered, non-unique membership.

is_set (): Boolean [1..1]

True if the semantics of this cardinality represent a set, i.e. unordered, unique membership.

{
    "name": "Cardinality",
    "documentation": "Express constraints on the cardinality of container objects which are the values of multiply-valued attributes, including uniqueness and ordering, providing the means to state that a container acts like a logical list, set or bag.",
    "properties": {
        "interval": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "interval",
            "documentation": "The interval of this cardinality. ",
            "is_mandatory": true,
            "type": "Multiplicity_interval"
        },
        "is_ordered": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "is_ordered",
            "documentation": "True if the members of the container attribute to which this cardinality refers are ordered. ",
            "is_mandatory": true,
            "type": "Boolean"
        },
        "is_unique": {
            "_type": "P_BMM_SINGLE_PROPERTY",
            "name": "is_unique",
            "documentation": "True if the members of the container attribute to which this cardinality refers are unique.",
            "is_mandatory": true,
            "type": "Boolean"
        }
    },
    "functions": {
        "is_bag": {
            "name": "is_bag",
            "documentation": "True if the semantics of this cardinality represent a bag, i.e. unordered, non-unique membership.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "is_list": {
            "name": "is_list",
            "documentation": "True if the semantics of this cardinality represent a list, i.e. ordered, non-unique membership.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        },
        "is_set": {
            "name": "is_set",
            "documentation": "True if the semantics of this cardinality represent a set, i.e. unordered, unique membership.",
            "result": {
                "_type": "P_BMM_SIMPLE_TYPE",
                "type": "Boolean"
            }
        }
    }
}
Cardinality