/* Lady and Tiger: Sixth day in Picat. From Adrian Groza "Modelling Puzzles in First Order Logic" """ Puzzle 42. Sixth 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 make no difference which room you pick Room 2: The other room contains a lady """ [room1 = 0,room2 = 0,who1 = 2,who2 = 1] Room 1 sign is false Room 2 sign is false Room 1: Tiger Room 2: Lady 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, % Room 1: It make no difference which room you pick % Interpreted as: either you find a lady in both rooms, or a tiger in both % Room1 #<=> (Who1 #= Lady #/\ Who2 #= Lady) #\/ (Who1 #= Tiger #/\ Who2 #= Tiger), Room1 #<=> (Who1 #= Who2), % Simpler % Room 2: The other room contains a 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.