Entity: Movie 198 77 null * title String 3 false false false rating double 3 false false false year int 3 false false false Operation: createPositiveActors Movie void n int m1 Movie m2 Movie m3 Movie m4 Movie m5 Movie static n >= 0 Actor->exists( a | a.name = "a" + ( 10 * n ) & a : m1.persons & a : m2.persons & a : m3.persons & a : m4.persons & Actor->exists( b | b.name = "a" + ( 10 * n + 1 ) & b : m1.persons & b : m2.persons & b : m3.persons & b : m4.persons & Actor->exists( c | c.name = "a" + ( n * 10 + 2 ) & c : m2.persons & c : m3.persons & c : m4.persons ) ) ) Operation: createPositiveActresses Movie void n int m1 Movie m2 Movie m3 Movie m4 Movie m5 Movie static n >= 0 Actress->exists( d | d.name = "a" + ( n * 10 + 3 ) & d : m2.persons & d : m3.persons & d : m4.persons & d : m5.persons & Actress->exists( e | e.name = "a" + ( n * 10 + 4 ) & e : m2.persons & e : m3.persons & e : m4.persons & e : m5.persons ) ) Operation: createPositive Movie void n int static n >= 0 Movie->exists( m1 | m1.rating = 10 * n & Movie->exists( m2 | m2.rating = 10 * n + 1 & Movie->exists( m3 | m3.rating = 10 * n + 2 & Movie->exists( m4 | m4.rating = 10 * n + 3 & Movie->exists( m5 | m5.rating = 10 * n + 4 & Movie.createPositiveActors(n,m1,m2,m3,m4,m5) & Movie.createPositiveActresses(n,m1,m2,m3,m4,m5) ) ) ) ) ) Operation: createNegativeActors Movie void n int m1 Movie m2 Movie m3 Movie m4 Movie m5 Movie static n >= 0 Actor->exists( a | a.name = "a" + ( 10 * n + 5 ) & a : m1.persons & a : m2.persons & Actor->exists( b | b.name = "a" + ( 10 * n + 6 ) & b : m1.persons & b : m2.persons & b : m3.persons ) ) Operation: createNegativeActresses Movie void n int m1 Movie m2 Movie m3 Movie m4 Movie m5 Movie static n >= 0 Actress->exists( c | c.name = "a" + ( 10 * n + 7 ) & c : m2.persons & c : m3.persons & c : m4.persons & Actress->exists( d | d.name = "a" + ( n * 10 + 8 ) & d : m3.persons & d : m4.persons & d : m5.persons & Actress->exists( e | e.name = "a" + ( n * 10 + 9 ) & e : m4.persons & e : m5.persons ) ) ) Operation: createNegative Movie void n int static n >= 0 Movie->exists( m1 | m1.rating = 10 * n + 5 & Movie->exists( m2 | m2.rating = 10 * n + 6 & Movie->exists( m3 | m3.rating = 10 * n + 7 & Movie->exists( m4 | m4.rating = 10 * n + 8 & Movie->exists( m5 | m5.rating = 10 * n + 9 & Movie.createNegativeActors(n,m1,m2,m3,m4,m5) & Movie.createNegativeActresses(n,m1,m2,m3,m4,m5) ) ) ) ) ) Type: MovieType 50 10 MOVIE TV VIDEO VIDEOGAME Entity: Person 226 221 null * abstract name String 3 false false false Entity: Actor 187 344 Person * Entity: Actress 306 348 Person * Entity: Group 464 89 null * abstract avgRating double 3 false false false Entity: Couple 432 215 Group * Operation: toString Couple String query true result = "Couple avgRating " + avgRating + ", " + commonMovies.size + " movies (" + ( p1.name.sum + "," + p2.name.sum ) + ")" Entity: Clique 533 286 Group * Operation: toString Clique String query true result = persons.size + "-Clique avgRating " + avgRating + ", " + commonMovies.size + " movies (" + persons.name.sum + ")" Entity: SortLib 616 29 null * external Operation: sortByN SortLib Sequence(null) s Sequence f Sequence n int query static true result = result Association: Movie Person 0 266 144 265 222 0 persons movies Association: Group Movie 0 465 98 285 86 0 commonMovies null Association: Couple Person 0 433 218 308 224 -1 p1 null Association: Couple Person 0 434 236 310 246 -1 p2 null Association: Clique Person 0 535 307 310 256 0 persons null Generalisation: Person Actor 227 345 231 258 Generalisation: Person Actress 320 349 306 258 Generalisation: Group Couple 474 215 474 126 Generalisation: Group Clique 575 287 573 126 GeneralUseCase: task2 false Constraint: p : Person q : p.movies.persons & p.name < q.name & comm = q.movies /\ p.movies & comm.size > 2 Couple->exists( c | p : c.p1 & q : c.p2 & c.commonMovies = comm ) null task2 false GeneralUseCase: task3 false Constraint: null true avgRating = ( commonMovies->collect(rating)->sum() ) / commonMovies.size Couple task3 false GeneralUseCase: exttask1 false Constraint: null bestcouples = SortLib.sortByN(Couple.allInstances,Couple->collect(-avgRating),15) bestcouples->forAll( c | c->display() ) null exttask1 false Constraint: null bestcouples2 = SortLib.sortByN(Couple.allInstances,Couple->collect(-commonMovies.size),15) bestcouples2->forAll( c | c->display() ) null exttask1 false GeneralUseCase: exttask2 n int false Constraint: null true Clique->exists( c | c.persons = p1 \/ p2 & c.commonMovies = commonMovies ) Couple exttask2 false Constraint: cl : Clique p : Person & p.name > cl.persons.name->max() & comm = cl.commonMovies /\ p.movies & comm.size > 2 Clique->exists( c | c.persons = cl.persons->including(p) & c.commonMovies = comm ) null exttask2 false GeneralUseCase: exttask3 false Constraint: null true avgRating = ( commonMovies->collect(rating)->sum() ) / commonMovies.size Clique exttask3 false GeneralUseCase: exttask4 n int false Constraint: null ncliques = Clique->select(persons.size = n) SortLib.sortByN(ncliques,ncliques->collect(-avgRating),15)->forAll( c | c->display() ) null exttask4 false Constraint: null ncliques2 = Clique->select(persons.size = n) SortLib.sortByN(ncliques2,ncliques2->collect(-commonMovies.size),15)->forAll( c | c->display() ) null exttask4 false GeneralUseCase: task1 n int false Constraint: null true Integer.subrange(0,n - 1)->forAll( x | Movie.createPositive(x) & Movie.createNegative(x) ) null task1 false GeneralUseCase: couple2clique false Constraint: null true Clique->exists( c | c.persons = p1 \/ p2 & c.commonMovies = commonMovies ) Couple couple2clique false GeneralUseCase: nextcliques false Constraint: p : Person p.name > persons@pre.name@pre->max() & comm = commonMovies@pre /\ p.movies & comm.size > 2 Clique->exists( c | c.persons = persons@pre->including(p) & c.commonMovies = comm ) Clique@pre nextcliques false