use> !create ra:RelationalAlgebra use> \ !let Country=Set{Sequence{'Germany', 'Berlin', '80'}, Sequence{'France', 'Paris', '60'}, Sequence{'Netherlands','Amsterdam','25'}} . use> ?ra.isRelation(Country) true : Boolean use> \ !let Town=Set{Sequence{'Berlin', '4'}, Sequence{'Hamburg', '2'}, Sequence{'Koeln', '1'}, Sequence{'Paris', '9'}, Sequence{'Marseille','2'}, Sequence{'Amsterdam','2'}} . use> ?ra.isRelation(Town) true : Boolean use> ?ra.selectV(3,#LE,'60',Country) Set{Sequence{'France', 'Paris', '60'}, Sequence{'Netherlands','Amsterdam','25'}} : Set(Sequence(String)) use> ?ra.selectC(1,#GT,2,Country) Set{Sequence{'Germany', 'Berlin', '80'}, Sequence{'Netherlands','Amsterdam','25'}} : Set(Sequence(String)) use> ?ra.project(Sequence{3,1},Country) Set{Sequence{'25','Netherlands'}, Sequence{'60','France' }, Sequence{'80','Germany'} } : Set(Sequence(String)) use> ?ra.product(Country,Town) Set{Sequence{'France', 'Paris', '60', 'Amsterdam', '2'}, Sequence{'France', 'Paris', '60', 'Berlin', '4'}, Sequence{'France', 'Paris', '60', 'Hamburg', '2'}, Sequence{'France', 'Paris', '60', 'Koeln', '1'}, Sequence{'France', 'Paris', '60', 'Marseille', '2'}, Sequence{'France', 'Paris', '60', 'Paris', '9'}, Sequence{'Germany', 'Berlin', '80', 'Amsterdam', '2'}, Sequence{'Germany', 'Berlin', '80', 'Berlin', '4'}, Sequence{'Germany', 'Berlin', '80', 'Hamburg', '2'}, Sequence{'Germany', 'Berlin', '80', 'Koeln', '1'}, Sequence{'Germany', 'Berlin', '80', 'Marseille', '2'}, Sequence{'Germany', 'Berlin', '80', 'Paris', '9'}, Sequence{'Netherlands', 'Amsterdam', '25', 'Amsterdam', '2'}, Sequence{'Netherlands', 'Amsterdam', '25', 'Berlin', '4'}, Sequence{'Netherlands', 'Amsterdam', '25', 'Hamburg', '2'}, Sequence{'Netherlands', 'Amsterdam', '25', 'Koeln', '1'}, Sequence{'Netherlands', 'Amsterdam', '25', 'Marseille', '2'}, Sequence{'Netherlands', 'Amsterdam', '25', 'Paris', '9'}} : Set(Sequence(String)) use> ?ra.project(Sequence{1,2,5}, ra.selectC(2,#EQ,4, ra.product(Country,Town))) Set{Sequence{'France', 'Paris', '9'}, Sequence{'Germany', 'Berlin', '4'}, Sequence{'Netherlands', 'Amsterdam', '2'}} : Set(Sequence(String)) use> \ ?ra.minus(ra.project(Sequence{1},Town), ra.project(Sequence{2},Country)) . Set{Sequence{'Hamburg' }, Sequence{'Koeln' }, Sequence{'Marseille'}} : Set(Sequence(String)) use> ?ra.union(Town,ra.project(Sequence{1,3},Country)) Set{Sequence{'Amsterdam', '2'}, Sequence{'Berlin', '4'}, Sequence{'France', '60'}, Sequence{'Germany', '80'}, Sequence{'Hamburg', '2'}, Sequence{'Koeln', '1'}, Sequence{'Marseille', '2'}, Sequence{'Netherlands', '25'}, Sequence{'Paris', '9'}} : Set(Sequence(String)) use> -- project[1](Country) - project[1](select[3 gt 6](Country,Country)) use> \ ?ra.minus(ra.project(Sequence{1},Country), ra.project(Sequence{1}, ra.selectC(3,#LT,6,ra.product(Country,Country)))) . Set{Sequence{'Germany'}} : Set(Sequence(String)) use> \ !let Job=Set{Sequence{'Ada','Analysis'}, Sequence{'Ada','Design' }, Sequence{'Bea','Analysis'}, Sequence{'Bea','Design' }, Sequence{'Bea','Coding' }, Sequence{'Cyd','Design' }, Sequence{'Cyd','Coding' }} . use> -- R(A,B), S(B): project[A](R)-project[A](product(project[A](R),S)-R) use> \ ?ra.minus(ra.project(Sequence{1},Job), ra.project(Sequence{1}, ra.minus(ra.product(ra.project(Sequence{1},Job), ra.project(Sequence{2},Job)), Job))) . Set{Sequence{'Bea'}} : Set(Sequence(String)) use> ?ra.join(Country,2,#EQ,1,Town) Set{Sequence{'France', 'Paris', '60', 'Paris', '9'}, Sequence{'Germany', 'Berlin', '80', 'Berlin', '4'}, Sequence{'Netherlands', 'Amsterdam','25', 'Amsterdam', '2'}} : Set(Sequence(String)) use> ?ra.project(Sequence{1,2,3,5},ra.join(Country,2,#EQ,1,Town)) Set{Sequence{'France', 'Paris', '60', '9'}, Sequence{'Germany', 'Berlin', '80', '4'}, Sequence{'Netherlands', 'Amsterdam', '25', '2'}} : Set(Sequence(String)) use> ?ra.natjoin(Country,Sequence{2},Sequence{1},Town) Set{Sequence{'France', 'Paris', '60', '9'}, Sequence{'Germany', 'Berlin', '80', '4'}, Sequence{'Netherlands', 'Amsterdam', '25', '2'}} : Set(Sequence(String)) use> ?let Age=Set{Sequence{'Ada', 'Apple', '42'}, Sequence{'Bea', 'Banana', '36'}, Sequence{'Cyd', 'Cherry', '42'}, Sequence{'Dan', 'Cherry', '10'}} in let Hair=Set{Sequence{'Almond', 'Ada', 'Blonde'}, Sequence{'Banana', 'Bea', 'Black' }, Sequence{'Cherry', 'Can', 'Black' }, Sequence{'Cherry', 'Dan', 'Brown' }} in ra.natjoin(Age,Sequence{2,1},Sequence{1,2},Hair) Set{Sequence{'Bea','Banana','36','Black'}, Sequence{'Dan','Cherry','10','Brown'}} : Set(Sequence(String)) use> ?let Rainy=Set{Sequence{'Oslo'},Sequence{'London'},Sequence{'Berlin'}} in let Sunny=Set{Sequence{'Berlin'},Sequence{'Rome'},Sequence{'Madrid'}} in ra.intersect(Rainy,Sunny) Set{Sequence{'Berlin'}} : Set(Sequence(String)) use> ?ra.max(3,Country) Set{Sequence{'Germany','Berlin','80'}} : Set(Sequence(String)) use> ?ra.min(3,Country) Set{Sequence{'Netherlands','Amsterdam','25'}} : Set(Sequence(String)) use> ?ra.max(2,Town) Set{Sequence{'Paris','9'}} : Set(Sequence(String)) use> ?ra.min(2,Town) Set{Sequence{'Koeln','1'}} : Set(Sequence(String)) use> ?ra.allValues(Country) Set{Sequence{'25'}, Sequence{'60'}, Sequence{'80'}, Sequence{'Amsterdam'}, Sequence{'Berlin'}, Sequence{'France'}, Sequence{'Germany'}, Sequence{'Netherlands'}, Sequence{'Paris'}} : Set(Sequence(String)) use> ?ra.allValues(Town) Set{Sequence{'1'}, Sequence{'2'}, Sequence{'4'}, Sequence{'9'}, Sequence{'Amsterdam'}, Sequence{'Berlin'}, Sequence{'Hamburg'}, Sequence{'Koeln'}, Sequence{'Marseille'}, Sequence{'Paris'}} : Set(Sequence(String)) use> ?ra.union(ra.allValues(Country),ra.allValues(Town))->flatten() Set{'1','2','25','4','60','80','9','Amsterdam','Berlin','France', 'Germany','Hamburg','Koeln','Marseille','Netherlands','Paris'} : Set(String) use> ?ra.divide(1,Job,ra.project(Sequence{2},Job)) Set{Sequence{'Bea'}} : Set(Sequence(String)) use> !let Job=Set{Sequence{'Ada','Apple', 'UML', 'Analysis'}, Sequence{'Ada','Apple', 'UML', 'Design'}, Sequence{'Bea','Banana','UML', 'Analysis'}, Sequence{'Bea','Banana','UML', 'Design'}, Sequence{'Bea','Banana','Ruby','Coding'}, Sequence{'Cyd','Cherry','UML', 'Design'}, Sequence{'Cyd','Cherry','Ruby','Coding'}} use> ?ra.divide(2,Job,ra.project(Sequence{3,4},Job)) Set{Sequence{'Bea','Banana'}} : Set(Sequence(String)) use> ?ra.product(ra.divide(2,Job,ra.project(Sequence{3,4},Job)), ra.project(Sequence{3,4},Job)) Set{Sequence{'Bea','Banana','Ruby','Coding'}, Sequence{'Bea','Banana','UML', 'Analysis'}, Sequence{'Bea','Banana','UML', 'Design'}} : Set(Sequence(String)) use> ?ra.modulo(2,Job,ra.project(Sequence{3,4},Job)) Set{Sequence{'Ada','Apple','UML','Analysis'}, Sequence{'Ada','Apple','UML','Design'}, Sequence{'Cyd','Cherry','Ruby','Coding'}, Sequence{'Cyd','Cherry','UML','Design'}} : Set(Sequence(String)) use> ?ra.divide(3,Job,ra.project(Sequence{4},Job)) Set{} : Set(Sequence(String)) use> ?ra.divide(2,ra.project(Sequence{1,2,4},Job),ra.project(Sequence{4},Job)) Set{Sequence{'Bea','Banana'}} : Set(Sequence(String))