/* Lady and Tiger: Ninth days: three rooms in Picat. From Adrian Groza "Modelling Puzzles in First Order Logic" """ Puzzle 45. Ninth day: three rooms One room contains a lady and the other two contain tigers. At most one of the three signs is true. Which door to open in order to find the lady, marry her, and get half of the kingdom as compensation? (Smullyan 2009) Room 1: A tiger is in this room Room 2: A lady is in this room Room 3: A tiger is in room 2 """ [room1 = 0,room2 = 0,room3 = 1,who1 = 1,who2 = 2,who3 = 2] Room 1 sign is false Room 2 sign is false Room 3 sign is true Room 1:Lady Room 2:Tiger Room 3:Tiger This program was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import cp. main => go. go ?=> Lady = 1, Tiger = 2, Rooms = [Room1,Room2,Room3], Rooms :: 0..1, Whos = [Who1,Who2,Who3], Whos :: Lady..Tiger, count(Lady,Whos,#=,1), count(Tiger,Whos,#=,2), sum(Rooms) #<= 1, Room1 #<=> Who1 #= Tiger, Room2 #<=> Who2 #= Lady, Room3 #<=> Who2 #= Tiger, Vars = [room1=Room1,room2=Room2,room3=Room3,who1=Who1,who2=Who2,who3=Who3], solve(Vars), println(Vars), printf("Room 1 sign is %w\n",cond(Room1 == 1,true,false)), printf("Room 2 sign is %w\n",cond(Room2 == 1,true,false)), printf("Room 3 sign is %w\n",cond(Room3 == 1,true,false)), Map = new_map([1="Lady",2="Tiger"]), printf("Room 1:%w Room 2:%w Room 3:%w\n",Map.get(Who1),Map.get(Who2),Map.get(Who3)), fail, nl. go => true.