/* Lady and Tigers: Fourth day: Ladies are honest but tigers are liars in Picat. From Adrian Groza "Modelling Puzzles in First Order Logic" """ Puzzle 40. Fourth day: Ladies are honest but tigers are liars 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 or 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: Both rooms contains ladies. Room 2: Both rooms contain ladies. """ [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, Room1 #<=> Who1 #= Lady #/\ Who2 #= Lady, Room2 #<=> Who1 #= Lady #/\ Who2 #= 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.