/* Lady and Tiger: Ladies only in Picat. From Adrian Groza "Modelling Puzzles in First Order Logic" """ Puzzle 39. Ladies only 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. 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: Either a tiger is in this room or a lady is in the other room. Room 2: A lady is in the other room. """ [room1 = 1,room2 = 1,who1 = 1,who2 = 1] Room 1 sign is true Room 2 sign is true Room 1: Lady 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, % Signs are false or true [Who1,Who2] :: Lady..Tiger, % Who is in Room 1 and Room 2? % The signs are either both true of both false. Room1 #= Room2, Room1 #<=> (Who1 #= Tiger #\/ Who2 #= Lady), Room2 #<=> Who1 #= Lady, 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.