enum Country = America | England | France | Germany | Italy enum Spiciness = Hot | Medium | Mild abstract Pizza -- pizza consists of a pizza base and 1..* of pizza toppings country -> Country ? -- the concrete Country will be constrained by subclasses xor PizzaBase DeepPanBase ThinAndCrispyBase PizzaTopping + spiciness -> Spiciness ? -- the concrete Spiciness will be constrained by the chosen topping country -> Country ? -- the concrete Country will be constrained by the chosen topping xor KindOfTopping xor CheeseTopping [spiciness = Mild] -- all cheese toppings are Mild and therefore the constraint is factored out instead of being repeated for each cheese topping FourCheesesTopping GoatsCheeseTopping GorgonzolaTopping MozzarellaTopping [PizzaTopping.country = Italy] ParmesanTopping xor FishTopping [spiciness = Mild] AnchoviesTopping MixedSeafoodTopping PrawnsTopping FruitTopping SultanaTopping [spiciness = Medium] xor HerbSpiceTopping CajunSpiceTopping [spiciness = Hot] RosemaryTopping [spiciness = Mild] xor MeatTopping ChickenTopping [spiciness = Mild] HamTopping ParmaHamTopping ? [spiciness = Mild] HotSpicedBeefTopping [spiciness = Hot] PeperoniSausageTopping [spiciness = Medium] NutTopping -- it is optional because under xor KindOFTopping PineKernels [spiciness = Mild] SauceTopping TabascoPepperSause [spiciness = Hot] xor VegetableTopping ArtichokeTopping [spiciness = Mild] AsparagusTopping [spiciness = Mild] CaperTopping [spiciness = Mild] GarlicTopping [spiciness = Medium] LeekTopping [spiciness = Mild] MushroomTopping [spiciness = Mild] OliveTopping [spiciness = Mild] OnionTopping [spiciness = Medium] RedOnionTopping ? xor PepperTopping GreenPepperTopping HotGreenPepperTopping ? [spiciness = Hot] JalapenoPepperTopping [spiciness = Hot] PeperonataTopping [spiciness = Medium] SweetPepperTopping [spiciness = Mild] PetitPoisTopping [spiciness = Mild] RocketTopping [spiciness = Medium] SpinachTopping [spiciness = Mild] xor TomatoTopping [spiciness = Mild] SlicedTomatoTopping SundriedTomatoTopping -- features characterizing the topping (these should be "read-only" features) SpicyTopping ? [ spiciness = Hot <=> SpicyTopping ] VegetarianTopping ? [ CheeseTopping || FruitTopping || HerbSpiceTopping || NutTopping || SauceTopping || VegetableTopping <=> VegetarianTopping ] -- features characterizing the pizza CheeseyPizza ? [ CheeseTopping <=> CheeseyPizza ] InterestingPizza ? [ # PizzaTopping >= 3 <=> InterestingPizza ] MeatyPizza ? [ MeatTopping <=> MeatyPizza] NonVegetarianPizza ? [ ~ VegetarianPizza <=> NonVegetarianPizza ] RealItalianPizza ? [ Pizza.country = Italy && ThinAndCrispyBase <=> RealItalianPizza ] SpicyPizza ? [ SpicyTopping <=> SpicyPizza] ThinAndCrispyPizza ? [ ThinAndCrispyBase <=> ThinAndCrispyPizza ] VegetarianPizza ? [ ~ FishTopping && ~ MeatTopping <=> VegetarianPizza ] VegetarianPizzaEquivalent1 ? [ all p : PizzaTopping | p.VegetarianTopping <=> VegetarianPizzaEquivalent1 ] -- common pizza types but not yet fully specialized (no PizzaBase) abstract American extends Pizza [ Pizza.country = America MozzarellaTopping PeperoniSausageTopping TomatoTopping ] abstract AmericanHot extends American [ HotGreenPepperTopping JalapenoPepperTopping ] abstract Cajun extends Pizza [ MozzarellaTopping OnionTopping PeperonataTopping PrawnsTopping TabascoPepperSause TomatoTopping ] abstract Capricciosa extends Pizza [ AnchoviesTopping CaperTopping HamTopping MozzarellaTopping OliveTopping PeperonataTopping TomatoTopping ] abstract Caprina extends Pizza [ GoatsCheeseTopping MozzarellaTopping SundriedTomatoTopping TomatoTopping ] abstract Fiorentina extends Pizza [ GarlicTopping && MozzarellaTopping && OliveTopping && ParmesanTopping && SpinachTopping && TomatoTopping ] abstract FruttiDiMare extends Pizza [ GarlicTopping && MixedSeafoodTopping && TomatoTopping ] abstract Giardiniera extends Pizza [ LeekTopping && MozzarellaTopping && MushroomTopping && OliveTopping PeperonataTopping && PetitPoisTopping && SlicedTomatoTopping && TomatoTopping ] abstract LeReine extends Pizza [ HamTopping && MozzarellaTopping && MushroomTopping && OliveTopping && TomatoTopping ] abstract Margherita extends Pizza [ MozzarellaTopping && TomatoTopping ] abstract Mushroom extends Pizza [ MozzarellaTopping && MushroomTopping && TomatoTopping ] abstract Napoletana extends Pizza [ AnchoviesTopping CaperTopping MozzarellaTopping OliveTopping TomatoTopping ] abstract FourSeasons extends Napoletana [ MushroomTopping PeperoniSausageTopping ] abstract Parmense extends Pizza [ AsparagusTopping HamTopping MozzarellaTopping ParmesanTopping TomatoTopping ] abstract PolloAdAstra extends Pizza [ CajunSpiceTopping ChickenTopping GarlicTopping MozzarellaTopping RedOnionTopping SweetPepperTopping TomatoTopping ] abstract PrinceCarlo extends Pizza [ LeekTopping MozzarellaTopping ParmesanTopping RosemaryTopping TomatoTopping ] abstract QuattroFromagi extends Pizza [ FourCheesesTopping TomatoTopping ] abstract Rosa extends Pizza [ GorgonzolaTopping MozzarellaTopping TomatoTopping ] abstract Siciliana extends Pizza [ AnchoviesTopping ArtichokeTopping GarlicTopping HamTopping MozzarellaTopping OliveTopping TomatoTopping ] abstract SloppyGiuseppe extends Pizza [ GreenPepperTopping HotSpicedBeefTopping MozzarellaTopping OnionTopping TomatoTopping ] abstract Soho extends Pizza [ GarlicTopping MozzarellaTopping OliveTopping ParmesanTopping RocketTopping TomatoTopping ] abstract UnclosedPizza extends Pizza [ MozzarellaTopping ] abstract Veneziana extends Pizza [ Pizza.country = Italy CaperTopping MozzarellaTopping OliveTopping OnionTopping PineKernels SultanaTopping TomatoTopping ] -- concrete pizza instances (fully specified) MyVeneziana extends Veneziana [ ThinAndCrispyBase GarlicTopping ]