/* Lady and Tiger: Fifth day in Picat. From Adrian Groza "Modelling Puzzles in First Order Logic" """ Puzzle 41. Fifth day Each of the two rooms contains either a lady or a tiger. There could be tigers in both rooms or ladies in both rooms. There is a sign on each room. If a lady is in room 1, then the sign on the door is true. If a tiger is in room 1, then the sign on the door is false. For room 2, the situation is opposite. If a lady is in room 2, then the sign on the door is false. If a tiger is in room 2, then the sign on the door is true. The signs are either both true of both false. Which door to open in order to find the lady, marry her, and get half of the kingdom as compensation? (Smullyan 2009) Room 1: At least one room contains a lady Room 2: The other room contains a lady """ [room1 = 1,room2 = 1,who1 = 1,who2 = 2] Room 1 sign is true Room 2 sign is true Room 1: Lady Room 2: 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, [Room1,Room2] :: 0..1, [Who1,Who2] :: Lady..Tiger, Room1 #<=> Who1 #= Lady #\/ Who2 #= Lady, Room2 #<=> Who1 #= Lady, % If a lady is in room 1, then the sign on the door is true. Who1 #= Lady #<=> Room1 #= 1, % If a tiger is in room 1, then the sign on the door is false. Who1 #= Tiger #<=> Room1 #= 0, % For room 2, the situation is opposite. % If a lady is in room 2, then the sign on the door is false. Who2 #= Lady #<=> Room2 #= 0, % If a tiger is in room 2, then the sign on the door is true. Who2 #= Tiger #<=> Room2 #= 1, % The signs are either both true or both false. Room1 #= Room2, Vars = [room1=Room1,room2=Room2,who1=Who1,who2=Who2], 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)), Map = new_map([1="Lady",2="Tiger"]), printf("Room 1: %w Room 2: %w\n",Map.get(Who1),Map.get(Who2)), nl, fail, nl. go => true.