Home More Samples
```///////////////////////////////////////////////////////////////////////////////
//
// Title: Cheese and Crackers
// Author: Marion McDee
// Publication: Dell Logic Puzzles
// Issue: February, 2000
// Page: 48
// Stars: 5
//
// Each Wednesday evening, Julie and five of her friends get together to play
// cards and break up the tedium of the work week. Last week, Julie hosted the
// gathering, and as her favorite deli was having a cheese sale, Julie selected
// six varieties (including Swiss) to serve as a snack, along with six flavors
// of crackers (including cumin seed crackers). In addition, Julie set out three
// kinds of fruit (apples, oranges, and pears) and three beverages (coffee, milk,
// and tea) on trays near the card table. When each friend settled in for the
// game, no two had chosen the same variety of cheese or cracker, and no one had
// selected more than one kind of fruit or beverage (at least one person chose
// each kind of fruit and beverage).
// From the following information, can you match each woman with the type of
// cheese, cracker, fruit, and beverage she enjoyed during the card game?

// 1. The six women are one who ate an apple, the person who sampled the
//    Roquefort cheese, a woman who drank milk, a woman who sipped coffee,
//    another woman who drank coffee, and a woman who chose tea.
// 2. The six women are a woman who drank tea, a woman who ate a pear, a person
//    who drank coffee, another woman who ate a pear, the friend who chose the
//    dill seed crackers, and another woman who sipped coffee.
// 3. The six women are one who drank coffee, the woman who ate celery seed
//    crackers, the friend who selected the Tilsit cheese, another woman who
//    drank coffee, a woman who drank tea, and a woman who ate an apple.
// 4. The six women are one who chose coffee, a friend who ate an apple, a
//    friend who chose a pear, the one who ate the Muenster cheese, the woman
//    who ate the caraway seed crackers, and the person who enjoyed the poppy
//    seed crackers.
// 5. The six women are a person who had tea, the woman who ate feta cheese,
//    tea, and another woman who chose an apple.
// 6. The six women are one who ate an apple, the woman who chose the Edam
//    cheese, a woman who sampled a pear, a woman who sipped coffee, another
//    woman who had an apple, and the one who selected the sesame seed crackers.
// 7. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Julie, Miriam, Olive, Rosa, Selena, and Winnie.
// 8. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Winnie, Selena, Rosa, Olive, Miriam, and Julie.
// 9. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Julie, Olive, Selena, Miriam, Rosa, and Winnie.
//10. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Olive, Miriam, Julie, Winnie, Selena, and Rosa.
//11. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Julie, Olive, Miriam, Selena, Rosa, and Winnie.
//12. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Miriam, Winnie, Olive, Rosa, Julie, and Selena.
//
// Determine: Woman - Cheese - Cracker - Fruit - Beverage
//
///////////////////////////////////////////////////////////////////////////////
//
// Query:
//
//          CheeseAndCrackerSolutions()
//
///////////////////////////////////////////////////////////////////////////////
//
// Result:
//
// Number of solutions:1
// cheese:    [ {Swiss} Winnie, {Feta} Miriam, {Tilsit} Julie,
//              {Roquefort} Selena, {Muenster} Rosa, {Edam} Olive]
// crackers:  [ {Cumin_Seed} Olive, {Celery_Seed} Miriam, {Dill_Seed} Rosa,
//              {Caraway_Seed} Julie, {Poppy_Seed} Selena, {Sesame_Seed} Winnie]
// fruits:    [ {Julie} Apple, {Miriam} Orange, {Olive} Pear, {Rosa} Apple,
//              {Selena} Pear, {Winnie} Apple]
// beverages: [ {Julie} Tea, {Miriam} Coffee, {Olive} Coffee, {Rosa} Milk,
//              {Selena} Tea, {Winnie} Coffee]
//
///////////////////////////////////////////////////////////////////////////////
//
// Notes:
//      The query "all CheeseAndCrackers(cheese,cracker,fruit,beverage)"
//      results in two identical solutions. To avoid displaying both
//      identical solutions, we collect and display them in the proc
//      CheeseAndCrackerSolutions.
//
///////////////////////////////////////////////////////////////////////////////

// Various type definitions

Woman = Julie | Miriam | Olive | Rosa | Selena | Winnie
Cheese = Swiss | Feta | Tilsit | Roquefort |Muenster | Edam
Cracker = Cumin_Seed | Celery_Seed | Dill_Seed | Caraway_Seed | Poppy_Seed | Sesame_Seed
Fruit = Apple | Orange | Pear
Beverage = Coffee | Milk | Tea

Cheeses = Cheese->>Woman        // Each woman a different cheese
Crackers = Cracker->>Woman      // Each woman a different cracker
Fruits = Woman->Fruit
Beverages = Woman->Beverage

Sequence = [0..5]->>Woman

///////////////////////////////////////////////////////////////////////////////
//
// Just a simple wrapper for pred CheeseAndCrackers(..)
//
proc CheeseAndCrackerSolutions() iff
all cheese,cracker,fruit,beverage in l
CheeseAndCrackers(cheese,cracker,fruit,beverage)
end &
// Number of distinct solutions is the length of the list of all solutions.
Print('\nNumber of solutions: ',Len(l),'\n') & PrintSolutions(l)

local proc PrintSolutions(l:<list(ch:Cheeses,cr:Crackers,fr:Fruits,bv:Beverages)) iff
if l = h,t then
Print('\ncheese:    ',h.ch) &
Print('\ncrackers:  ',h.cr) &
Print('\nfruits:    ',h.fr) &
Print('\nbeverages: ',h.bv,'\n') &
PrintSolutions(t)   // if more then one solution, display them all
end

///////////////////////////////////////////////////////////////////////////////
//
// The main predicate. Transcribe all clues using F1 syntax.
//
pred CheeseAndCrackers(cheese::Cheeses,cracker::Crackers,fruit::Fruits,bev::Beverages) iff
sequences :: [0..5]->Sequence &
sequences = [seq1,seq2,seq3,seq4,seq5,seq6] &

//  At least one person chose each kind of fruit...

fruit(_) = Apple &
fruit(_) = Pear &
fruit(_) = Orange &

//  ...and beverage.

bev(_) = Tea &
bev(_) = Milk &
bev(_) = Coffee &

// 1. The six women are one who ate an apple, the person who sampled the
//    Roquefort cheese, a woman who drank milk, a woman who sipped coffee,
//    another woman who drank coffee, and a woman who chose tea.

Apple = fruit(apple1) &
Milk = bev(milk1) &
Coffee = bev(coffee1a) &
Coffee = bev(coffee1b) &
Tea = bev(tea1) &

coffee1a <> coffee1b &
seq1 = [apple1,cheese(Roquefort),milk1,coffee1a,coffee1b,tea1] &

// 2. The six women are a woman who drank tea, a woman who ate a pear, a person
//    who drank coffee, another woman who ate a pear, the friend who chose the
//    dill seed crackers, and another woman who sipped coffee.

Tea = bev(tea2) &
Coffee = bev(coffee2a) &
Coffee = bev(coffee2b) &
Pear = fruit(pear2a) &
Pear = fruit(pear2b) &
seq2 = [tea2,pear2a,coffee2a,pear2b,cracker(Dill_Seed),coffee2b] &

// 3. The six women are one who drank coffee, the woman who ate celery seed
//    crackers, the friend who selected the Tilsit cheese, another woman who
//    drank coffee, a woman who drank tea, and a woman who ate an apple.

Coffee = bev(coffee3a) &
Coffee = bev(coffee3b) &
Tea = bev(tea3) &
Apple = fruit(apple3)  &
seq3 = [coffee3a,cracker(Celery_Seed),cheese(Tilsit),coffee3b,tea3,apple3] &

// 4. The six women are one who chose coffee, a friend who ate an apple, a
//    friend who chose a pear, the one who ate the Muenster cheese, the woman
//    who ate the caraway seed crackers, and the person who enjoyed the poppy
//    seed crackers.

Apple = fruit(apple4) &
Pear = fruit(pear4) &
Coffee = bev(coffee4) &
seq4 = [coffee4,apple4,pear4,cheese(Muenster),cracker(Caraway_Seed),cracker(Poppy_Seed)] &

// 5. The six women are a person who had tea, the woman who ate feta cheese,
//    tea, and another woman who chose an apple.

Apple = fruit(apple5a) &
Apple = fruit(apple5b) &
Coffee = bev(coffee5) &
Tea = bev(tea5a) &
Tea = bev(tea5b) &
seq5 = [tea5a,cheese(Feta),coffee5,apple5a,tea5b,apple5b] &

// 6. The six women are one who ate an apple, the woman who chose the Edam
//    cheese, a woman who sampled a pear, a woman who sipped coffee, another
//    woman who had an apple, and the one who selected the sesame seed crackers.

Apple = fruit(apple6a) &
Apple = fruit(apple6b) &
Pear = fruit(pear6) &
Coffee = bev(coffee6) &
seq6 = [apple6a,cheese(Edam),pear6,coffee6,apple6b,cracker(Sesame_Seed)] &

// 7. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Julie, Miriam, Olive, Rosa, Selena, and Winnie.
sequences(x1) = [Julie, Miriam, Olive, Rosa, Selena, Winnie] &

// 8. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Winnie, Selena, Rosa, Olive, Miriam, and Julie.

sequences(x2) = [Winnie, Selena, Rosa, Olive, Miriam, Julie] &

// 9. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Julie, Olive, Selena, Miriam, Rosa, and Winnie.

sequences(x3) = [Julie, Olive, Selena, Miriam, Rosa, Winnie] &

//10. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Olive, Miriam, Julie, Winnie, Selena, and Rosa.

sequences(x4) = [Olive, Miriam, Julie, Winnie, Selena, Rosa] &

//11. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Julie, Olive, Miriam, Selena, Rosa, and Winnie.

sequences(x5) = [Julie, Olive, Miriam, Selena, Rosa, Winnie] &

//12. In one of the sequences in clues 1 through 6, the women are listed in the
//    following order: Miriam, Winnie, Olive, Rosa, Julie, and Selena.

sequences(x6) = [Miriam, Winnie, Olive, Rosa, Julie, Selena]

```