Entity: FamilyRegister 156 62 null * frId String 3 false true false Entity: Family 129 185 null * name String 3 false false false id String 3 false true false Entity: FamilyMember 139 385 null * name String 3 false false false memberId String 3 false true false Entity: PersonRegister 448 59 null * prId String 3 false true false Entity: Person 558 214 null * abstract name String 3 false false false familyId String 3 false false false birthday int 3 false false false personId String 3 false true false Entity: Male 504 387 Person * Entity: Female 622 389 Person * Entity: StringLib 595 435 null * Operation: before StringLib String str String delim String query static true i = str->indexOf(delim) & ( ( i > 0 => result = str.subrange(1,i - 1) ) & ( i <= 0 => result = str ) ) Operation: after StringLib String str String delim String query static true i = str->indexOf(delim) & ( ( i > 0 => result = str.subrange(i + delim.size,str.size) ) & ( i <= 0 => result = str ) ) Operation: equalsIgnoreCase StringLib boolean s1 String s2 String query static true str1 = s1.toLowerCase & str2 = s2.toLowerCase & ( ( str1 = str2 => result = true ) & ( str1 /= str2 => result = false ) ) Operation: lastIndexOf StringLib int s String d String query static true r = s.reverse & i = r->indexOf(d) & result = s.size - i + 1 Operation: split StringLib Sequence(String) str String delim String query static true result = str Operation: replace StringLib String str String delim String s2 String query static delim.size > 0 result = str Operation: trim StringLib String str String query static true result = str Association: FamilyRegister Family 1 194 101 208 186 0 families null Association: Family FamilyMember 1 137 238 144 369 -1 mother null Association: Family FamilyMember 1 167 243 219 383 -1 father null Association: Family FamilyMember 1 290 238 300 383 0 sons null Association: Family FamilyMember 1 345 236 408 379 0 daughters null Association: PersonRegister Person 1 580 105 645 215 0 persons null Generalisation: Person Male 546 389 570 301 Generalisation: Person Female 680 391 677 302 Activity: StringLib split res : Sequence := Sequence{} ; i : int ; i := str->indexOf(delim) ; while i > 0 do ( res := res->append(str.subrange(1,i - 1)) ; str := str.subrange(i + delim.size,str.size) ; i := str->indexOf(delim) ) ; res := res->append(str) ; return res Activity: StringLib replace res : String ; res := "" ; i : int ; i := str->indexOf(delim) ; while i > 0 do ( res := res + str.subrange(1,i - 1) + s2 ; str := str.subrange(i + delim.size,str.size) ; i := str->indexOf(delim) ) ; res := res + str ; return res Activity: StringLib trim res : String ; res := "" ; i : int ; i := 1 ; while ( i < str.size & str[i] = " " ) do i := i + 1 ; j : int ; j := str.size ; while j >= 1 & str[j] = " " do j := j - 1 ; if j < i then res := "" else res := str.subrange(i,j) ; return res Constraint: null true FamilyMember->forAll( x | x : mother => x /: daughters ) Family false GeneralUseCase: person2family false Constraint: null true Family->exists( fam | fam.id = familyId & fam.name = StringLib.before(name,", ") ) Female person2family false Constraint: fam = Family[familyId] null FamilyMember->exists( m | m.memberId = personId & m.name = StringLib.after(name,", ") & ( ( fam.mother@pre.size = 0 => m : fam.mother & m /: fam.daughters ) & ( fam.mother@pre.size > 0 & fam.mother@pre->excludes(m) => m : fam.daughters ) ) ) Female person2family false Constraint: null true Family->exists( fam | fam.id = familyId & fam.name = StringLib.before(name,", ") ) Male person2family false Constraint: fam = Family[familyId] null FamilyMember->exists( m | m.memberId = personId & m.name = StringLib.after(name,", ") & ( ( fam.father@pre.size = 0 => m : fam.father & m /: fam.sons ) & ( fam.father@pre.size > 0 & fam.father@pre->excludes(m) => m : fam.sons ) ) ) Male person2family false Constraint: null true families = Family.allInstances FamilyRegister person2family false UseCaseInvariant: null true FamilyMember->forAll( m | m : mother->union(daughters) => Female->exists( f | f.personId = m.memberId & f.familyId = id & f.name = name + ", " + m.name ) ) Family person2family UseCaseInvariant: null true FamilyMember->forAll( m | m : father->union(sons) => Male->exists( f | f.personId = m.memberId & f.familyId = id & f.name = name + ", " + m.name ) ) Family person2family GeneralUseCase: family2person false Constraint: null m : mother->union(daughters) Female->exists( f | f.personId = m.memberId & f.familyId = id & f.name = name + ", " + m.name ) Family family2person false Constraint: null m : father->union(sons) Male->exists( f | f.personId = m.memberId & f.familyId = id & f.name = name + ", " + m.name ) Family family2person false Constraint: null true persons = Person.allInstances PersonRegister family2person false UseCaseInvariant: null true FamilyMember->exists( m | m.memberId = personId & Family->exists( fam | fam.id = familyId & m : fam.mother->union(fam.daughters) & name = fam.name + ", " + m.name ) ) Female family2person UseCaseInvariant: null true FamilyMember->exists( m | m.memberId = personId & Family->exists( fam | fam.id = familyId & m : fam.father->union(fam.sons) & name = fam.name + ", " + m.name ) ) Male family2person