/* Lady and Tiger: Seventh day in Picat. From Adrian Groza "Modelling Puzzles in First Order Logic" """ Puzzle 43. Seventh 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: It makes a difference which room you pick Room 2: You are better off choosing the other room. """ [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.