This content area is UNDER CONSTRUCTION or MIGRATION
Context
Analysis snippets
  1. Kernel

    opposite =
    if owningAssociation->isEmpty() and association.memberEnd->size() = 2 then
    let otherEnd = (association.memberEnd - self)->any() in
    if otherEnd.owningAssociation->isEmpty() then otherEnd else Set{} endif
    else Set {}
    endif

  2. Kernel

    isComposite implies (upperBound()->isEmpty() or upperBound() <= 1)

  3. Kernel

    subsettedProperty->notEmpty() implies
    (subsettingContext()->notEmpty() and subsettingContext()->forAll (sc |
    subsettedProperty->forAll(sp |
    sp.subsettingContext()->exists(c | sc.conformsTo(c)))))

  4. Kernel

    if (redefinedProperty->notEmpty()) then
    (redefinitionContext->notEmpty() and
    redefinedProperty->forAll(rp|
    ((redefinitionContext->collect(fc|
    fc.allParents()))->asSet())->
    collect(c| c.allFeatures())->asSet()->
    includes(rp))

  5. Kernel

    subsettedProperty->forAll(sp |
    type.conformsTo(sp.type) and
    ((upperBound()->notEmpty() and sp.upperBound()->notEmpty()) implies
    upperBound()<=sp.upperBound() ))

  6. isReadOnly implies isNavigable()

  7. isDerivedUnion implies isDerived

  8. isDerivedUnion implies isReadOnly

  9. isComposite = (self.aggregation = #composite)

  10. if (self.subsettedProperty->notEmpty()) then
    self.subsettedProperty->forAll(sp | sp.name <> self.name)