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.
