HomeHome More SamplesMore Samples
///////////////////////////////////////////////////////////////////////////////
//
// Title: Bob's Shish Kebabs
// Author: Jo Mason
// Publication: Dell Logic Puzzles
// Issue: June, 1998
// Page: 24
// Stars: 3 (a 5 for the computer!)
// 
// Bob and Patty invited their friends Javier and Marie over for a cookout. On
// the menu were grilled marinated beef cubes and four kinds of vegetables -- 
// mushrooms, onions, peppers, and tomatoes -- which were put onto skewers. 
// The first skewer that each person made had three beef cubes and one piece
// of three kinds of vegetables -- each person disliked a different vegetable
// and omitted it from his or her skewer. The six pieces can be numbered 1 to
// 6 from the handle to the point of the skewer. Can you tell what item each 
// person had in each position?
// 
// 1.  No kebab had two beef cubes right next to each other.
// 2.  No one's beef cubes were in the same three positions as anyone else's.
// 3.  One shish kebab's first three items (numbers 1, 2, and 3 respectively) 
//     were beef, pepper, and mushroom; this wasn't Javier's.
// 4.  One skewer had beef cubes in positions 1, 3, and 5, and a tomato wedge 
//     in position 6.
// 5.  Bob, who loves onions and included a chunk on his skewer, had vegetables
//     in both positions 4 and 5.
// 6.  On the four kebabs, the items in position 5 were beef, mushroom, onion, 
//     and tomato.
// 7.  Each onion chunk was immediately between two beef cubes.
// 8.  No pepper was immediately between two beef cubes.
// 9.  Marie can't stand mushrooms and left them off her skewer.
// 10. At least two kebabs had the same vegetable in the same position at 
//     least once. 
// 
///////////////////////////////////////////////////////////////////////////////
//      
// Query: 
//
//          ShishKebabsSolutions()
//
///////////////////////////////////////////////////////////////////////////////
//
// Result:
//
// Number of solutions:1
// Bob:    [Beef,Onion,Beef,Pepper,Mushroom,Beef]
// Patty:  [Beef,Pepper,Mushroom,Beef,Tomato,Beef]
// Javier: [Beef,Onion,Beef,Mushroom,Beef,Tomato]
// Marie:  [Pepper,Beef,Tomato,Beef,Onion,Beef]    
//
///////////////////////////////////////////////////////////////////////////////

local Person = Bob | Patty | Javier | Marie
local SkewerBit = Beef | Mushroom | Onion | Pepper | Tomato 
local OneSkewer = [0..5]->SkewerBit 
local Skewer = Person->>OneSkewer

proc ShishKebabsSolutions() iff
    all skewer in l 
        ShishKebabs(skewer)
    end & Print('\nNumber of solutions:',Len(l)) & 
    PrintShishKebabSolutions(l)

local proc PrintShishKebabSolutions(l :< list Skewer) iff
    if l = h,t then
        Print('\nBob:    ') & Print(h(Bob)) &
        Print('\nPatty:  ') & Print(h(Patty)) &
        Print('\nJavier: ') & Print(h(Javier)) &
        Print('\nMarie:  ') & Print(h(Marie)) &
        PrintShishKebabSolutions(t)        
    end

local pred ShishKebabs(skewer::Skewer) iff
// 1.  No kebab had two beef cubes right next to each other.
// 2.  No one's beef cubes were in the same three positions as anyone else's.

    beefs::[0..3]->>[0..2]->I[0..5] & //beef positions for each skewer, all different
    beefs = [beefmarie,beefpatty,beefjavier,beefbob] &

//  The first skewer that each person made had three beef cubes and one piece
//  of three kinds of vegetables -- each person disliked a different vegetable
//  and omitted it from his or her skewer.

    ThreeBeefPieces(skewer(Bob),beefbob) &
    ThreeBeefPieces(skewer(Patty),beefpatty) &
    ThreeBeefPieces(skewer(Javier),beefjavier) &
    ThreeBeefPieces(skewer(Marie),beefmarie) &

    PlaceVeggies(skewer(_),Mushroom,Tomato,Onion) &
    PlaceVeggies(skewer(_),Mushroom,Tomato,Pepper) &
    PlaceVeggies(skewer(_),Mushroom,Onion,Pepper) &
    PlaceVeggies(skewer(_),Onion,Pepper,Tomato) &

// 3.  One shish kebab's first three items (numbers 1, 2, and 3 respectively) 
//     were beef, pepper, and mushroom; this wasn't Javier's.
     skewer(x3) = [Beef,Pepper,Mushroom,_,_,_] & (x3 = Bob | x3 = Marie | x3 = Patty) &

// 4.  One skewer had beef cubes in positions 1, 3, and 5, and a tomato wedge 
//     in position 6.
    skewer(_) = [Beef,_,Beef,_,Beef,Tomato] &

// 5.  Bob, who loves onions and included a chunk on his skewer, had vegetables
//     in both positions 4 and 5.
    skewer(Bob,_) = Onion &
    skewer(Bob,3) <> Beef & skewer(Bob,4) <> Beef &   

// 6.  On the four kebabs, the items in position 5 were beef, mushroom, onion, 
//     and tomato.
    skewer(_) = [_,_,_,_,Beef,_] &
    skewer(_) = [_,_,_,_,Mushroom,_] &
    skewer(_) = [_,_,_,_,Onion,_] &
    skewer(_) = [_,_,_,_,Tomato,_] &

// 7.  Each onion chunk was immediately between two beef cubes.
    OnionBetweenBeef(skewer(Bob)) &
    OnionBetweenBeef(skewer(Patty)) &
    OnionBetweenBeef(skewer(Javier)) &
    OnionBetweenBeef(skewer(Marie)) &

// 8.  No pepper was immediately between two beef cubes.
    NoPepperBetweenBeef(skewer(Bob)) &
    NoPepperBetweenBeef(skewer(Patty)) &
    NoPepperBetweenBeef(skewer(Javier)) &
    NoPepperBetweenBeef(skewer(Marie))  &

// 9.  Marie can't stand mushrooms and left them off her skewer.
    ~Mushroom in skewer(Marie) &

// 10. At least two kebabs had the same vegetable in the same position at 
//     least once. 
    IsVeggie(skewer(x10a,y)) & IsVeggie(skewer(x10b,y)) &   
    x10a <> x10b &
    skewer(x10a,y) = skewer(x10b,y) 

// Place three beef pieces on a skewer. (In three different positions)
// No two beef pieces can be next to each other
local pred ThreeBeefPieces(skewer::OneSkewer,beefpos::[0..2]->I[0..5]) iff
    skewer(x1) = Beef & skewer(x2) = Beef & skewer(x3) = Beef &
    x1 + 1 < x2 & x1 + 3 < x3 &
    x2 + 1 < x3 &
    beefpos = [x1,x2,x3] 

// Ensure the requested skewer bit qualifies as a veggie piece
local pred IsVeggie(x::SkewerBit) iff
    x = Mushroom | x = Onion | x = Tomato | x = Pepper

// Given a skewer, ensure it contains given veggies
local pred PlaceVeggies(skewer::OneSkewer,v1:<SkewerBit,v2:<SkewerBit,v3:<SkewerBit) iff
    skewer(x) = v1 &
    skewer(y) = v2 &
    skewer(z) = v3 

///////////////////////////////////////////////////////////////////////////////
// True iff:
// Either there is no pepper, or the pepper is not immediately between two 
// beef cubes. 
local pred NoPepperBetweenBeef(skewer::OneSkewer) iff
    ~Pepper in skewer |
    (
    skewer(x) = Pepper & 
        (
        skewer(x+1) <> Beef | 
        skewer(x-1) <> Beef | 
        x = 0 |     // leftmost place
        x = 5       // rightmost place
        )
    )

///////////////////////////////////////////////////////////////////////////////
// True iff:
// Either there is no onion, or the onion is immediately between two beef cubes
local pred OnionBetweenBeef(skewer::OneSkewer) iff
     ~Onion in skewer | 
    (skewer(x) = Onion & skewer(x-1) = Beef & skewer(x+1) = Beef) 

  
  


This page was created by F1toHTML