

------------------------------------------------------------------------------------------------------------------

-- This Alloy file is generated using Umple from AlloySophisticatedAssociations.ump

------------------------------------------------------------------------------------------------------------------


-- Defines a signature for class A
sig A {
  bs : set B,
  cs : some C
}

-- Defines a signature for class B
sig B {
  cs : some C,
  a : lone A
}

-- Defines a signature for class C
sig C {
  as_ : some A,
  b : one B,
  d : one D
}

-- Defines a signature for class D
sig D {
  cs : some C
}


-- Defines constraints on association between B and A
fact AssociationFact {
  B <: a in (B) set -> set (A)
}

-- Defines constraints on association between C and B
fact AssociationFact {
  C <: b in (C) some -> some (B)
}

-- Defines constraints on association between A and C
fact AssociationFact {
  A <: cs in (A) some -> some (C)
}

-- Defines constraints on association between C and D
fact AssociationFact {
  C <: d in (C) some -> some (D)
}

-- Defines bidirectionality rule between class A and class B
fact BidirectionalityRule {
  all a_1 : A, b_1 : B |
    a_1 in a[b_1] <=> b_1 in bs[a_1]
}

-- Defines numeric bound rule for class A
fact NumericBoundFact {
  no a_1 : A |
    #a_1.bs > 2
}

-- Defines bidirectionality rule between class B and class C
fact BidirectionalityRule {
  all b_1 : B, c_1 : C |
    b_1 in b[c_1] <=> c_1 in cs[b_1]
}

-- Defines numeric bound rule for class B
fact NumericBoundFact {
  no b_1 : B |
    #b_1.cs < 1 || #b_1.cs > 3
}

-- Defines bidirectionality rule between class C and class A
fact BidirectionalityRule {
  all c_1 : C, a_1 : A |
    c_1 in cs[a_1] <=> a_1 in as_[c_1]
}

-- Defines numeric bound rule for class A
fact NumericBoundFact {
  no a_1 : A |
    #a_1.cs < 3 || #a_1.cs > 5
}

-- Defines numeric bound rule for class C
fact NumericBoundFact {
  no c_1 : C |
    #c_1.as_ < 3 || #c_1.as_ > 7
}

-- Defines bidirectionality rule between class D and class C
fact BidirectionalityRule {
  all d_1 : D, c_1 : C |
    d_1 in d[c_1] <=> c_1 in cs[d_1]
}

-- Defines numeric bound rule for class D
fact NumericBoundFact {
  no d_1 : D |
    #d_1.cs != 4
}
