Working with sets
In all examples of sets given so far sets are used for indexing other modeling objects. But they may also be used for different purposes.
The following example (model setops.mos) demonstrates the use of basic set operations in Mosel: union (+), intersection (*), and difference (-):
model "Set example" declarations Cities={"rome", "bristol", "london", "paris", "liverpool"} Ports={"plymouth", "bristol", "glasgow", "london", "calais", "liverpool"} Capitals={"rome", "london", "paris", "madrid", "berlin"} end-declarations Places:= Cities+Ports+Capitals ! Create the union of all 3 sets In_all_three:= Cities*Ports*Capitals ! Create the intersection of all 3 sets Cities_not_cap:= Cities-Capitals ! Create the set of all cities that are ! not capitals writeln("Union of all places: ", Places) writeln("Intersection of all three: ", In_all_three) writeln("Cities that are not capitals: ", Cities_not_cap) end-model
The output of this example will look as follows:
Union of all places:{`rome',`bristol',`london',`paris',`liverpool', `plymouth',`bristol',`glasgow',`calais',`liverpool',`rome',`paris', `madrid',`berlin'} Intersection of all three: {`london'} Cities that are not capitals: {`bristol',`liverpool}
Sets in Mosel are indeed a powerful facility for programming as in the following example (model prime.mos) that calculates all prime numbers between 2 and some given limit.
Starting with the smallest one, the algorithm takes every element of a set of numbers SNumbers (positive numbers between 2 and some upper limit that may be specified when running the model), adds it to the set of prime numbers SPrime and removes the number and all its multiples from the set SNumbers.
model Prime parameters LIMIT=100 ! Search for prime numbers in 2..LIMIT end-parameters declarations SNumbers: set of integer ! Set of numbers to be checked SPrime: set of integer ! Set of prime numbers end-declarations SNumbers:={2..LIMIT} writeln("Prime numbers between 2 and ", LIMIT, ":") n:=2 repeat while (not(n in SNumbers)) n+=1 SPrime += {n} ! n is a prime number i:=n while (i<=LIMIT) do ! Remove n and all its multiples SNumbers-= {i} i+=n end-do until SNumbers={} writeln(SPrime) writeln(" (", getsize(SPrime), " prime numbers.)") end-model
This example uses a new function, getsize, that if applied to a set returns the number of elements of the set. The condition in the while loop is the logical negation of an expression, marked with not: the loop is repeated as long as the condition n in SNumbers is not satisfied.
Set operators
The preceding example introduces the operator += to add sets to a set (there is also an operator -= to remove subsets from a set). Another set operator used in the example is in denoting that a single object is contained in a set. We have already encountered this operator in the enumeration of indices for the forall loop.
Mosel also defines the standard operators for comparing sets: subset (<=), superset (>=), difference (<>), end equality (=). Their use is illustrated by the following example (model setcomp.mos):
model "Set comparisons" declarations RAINBOW = {"red", "orange", "yellow", "green", "blue", "purple"} BRIGHT = {"yellow", "orange"} DARK = {"blue", "brown", "black"} end-declarations writeln("BRIGHT is included in RAINBOW: ", BRIGHT <= RAINBOW) writeln("RAINBOW is a superset of DARK: ", RAINBOW >= DARK) writeln("BRIGHT is different from DARK: ", BRIGHT <> DARK) writeln("BRIGHT is the same as RAINBOW: ", BRIGHT = RAINBOW) end-model
As one might have expected, this example produces the following output:
BRIGHT is included in RAINBOW: true RAINBOW is a superset of DARK: false BRIGHT is different from DARK: true BRIGHT is the same as RAINBOW: false
© 2001-2019 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.