Alloy Exam Exercises
2021 06 24 WE1 Q1 (7 points) Truck Company
Consider a transportation company that is organizing a package pick-up service. The company has a certain number of trucks and drivers. All trucks have the same size. Each day, each driver drives a single truck (the same driver can drive different trucks in different days).
A pick-up request is specified by the origin and the size of the package (for simplicity, assume there are only two sizes, small and large).
A travel plan is associated with a driver and a truck in a certain day and is defined in terms of the packages that must be collected by that driver during the day, using the specified truck.
Point A (2 points)
Define suitable Alloy signatures – and any related constraints – to describe the problem above.
abstract sig Size {}
one sig Small extends Size {}
one sig Large extends Size {}
sig Place {}
sig Day {}
sig Package {
origin: Place,
size: Size
}
sig Driver {}
sig Truck {}
sig TravelPlan {
day: Day,
driver: Driver,
packages: set Package,
truck: Truck
}
fact packageInAtMostOneTravelPlan {
all pk: Package, tp1: TravelPlan, tp2: TravelPlan |
(tp1 != tp2 and pk in tp1.packages) implies pk not in tp2.packages
}
Point B (2 points)
Define a signature TruckStatus that represents the snapshot of a truck, that is, the truck with its current content and current driver. Ensure that the following constraint holds: a truck never exceeds its maximum capacity, which corresponds to an amount of packages whose size is equivalent to 2 large packages. We consider that the size of one large package is equivalent to the size of 4 small packages.
pred sizePackagesCoherent[ps: set Package] {
// 0 Large
(#ps <= 8 and no p: Package | p in ps and p.size = Large) or
// 1 large
(#ps <= 5 and one p: Package | p in ps and p.size = Large) or
// 2 Large
(#ps <= 2)
}
sig TruckStatus {
truck: one Truck,
currentDriver: lone Driver,
currentContent: set Package
}{sizePackagesCoherent[currentContent]}
Point C (1.5 points)
Formalize the following constraint: a travel plan should never exceed the truck capacity.
fact noTravelPlanExceedsCapacity {
all tp: TravelPlan | sizePackagesCoherent[tp.packages]
}
Point D (1.5 points)
Formalize the following constraint: drivers and trucks cannot be assigned to multiple travel plans in the same day.
fact AtMostOneTralvelPlanPerDayAndDriver {
all disj tp1, tp2: TravelPlan | (tp1.driver = tp2.driver) => tp1.day != tp2.day
}
fact AtMostOneTralvelPlanPerDayAndTruck {
all disj tp1, tp2: TravelPlan | (tp1.truck = tp2.truck) => tp1.day != tp2.day
}