declare proc {Zebra Nb} Groups= [ [english spanish japanese italian norwegian] [green red yellow blue white] [painter diplomat violinist doctor sculptor] [dog zebra fox snails horse] [juice water tea coffee milk] ] Properties proc {Partition Group} {FD.distinct {Map Group fun {$ P} Nb.P end}} end proc {Adjacent X Y} {FD.distance X Y '=:' 1} end in Properties = {FoldR Groups Append nil} % Nb maps all properties to house numbers {FD.record number Properties 1#5 Nb} {ForAll Groups Partition} Nb.english = Nb.red Nb.spanish = Nb.dog Nb.japanese = Nb.painter Nb.italian = Nb.tea Nb.norwegian = 1 Nb.green = Nb.coffee Nb.green >: Nb.white Nb.sculptor = Nb.snails Nb.diplomat = Nb.yellow Nb.milk = 3 {Adjacent Nb.norwegian Nb.blue} Nb.violinist = Nb.juice {Adjacent Nb.fox Nb.doctor} {Adjacent Nb.horse Nb.diplomat} Nb.zebra = Nb.white {FD.distribute ff Nb} end {ExploreOne Zebra}
1#number(blue:2 coffee: 5 diplomat: 3 doctor: 4 dog: 3 english: 4 fox: 5 green: 5 horse: 4 italian: 2 japanese: 5 juice: 1 milk: 3 norwegian: 1 painter: 5 red: 4 sculptor: 2 snails: 2 spanish: 3 tea: 2 violinist: 1 water: 4 white: 1 zebra: 1)Well, so the norwegian violinist owns the zebra.