Solution: The birthday

The code...

proc {Birthday Distrib}
   A B C D X   % X represents the truth for ALL assertions
   % 1 = idiot incinerator, 2 = screaming sack,
   % 3 = rolling rock,      4 = useless underwear
   Distrib=sol(A B C D X)
   [A B C D] ::: 1#4
   X :: 0#1
   {FD.distinct [A B C D]}
   {FD.impl (A=:1) {FD.conj (B=:2) (D=:3)} X}
   {FD.impl (A=:3) {FD.conj (B=:4) (D=:1)} X}
   {FD.impl (A=:2) {FD.conj (C=:4) (D=:3)} X}
   {FD.impl (A=:4) {FD.conj (B=:1) (C=:2)} X}
   {FD.impl (B=:3) {FD.conj (A=:1) (C=:2)} X}
   {FD.impl (B=:1) {FD.conj (A=:1) (D=:2)} X}
   {FD.impl (C=:2) (D=:1) X}
   {FD.impl (C=:4) {FD.conj (B=:1) (C=:3)} X}

   {FD.impl (D=:4) {FD.conj (A=:1) (C=:2)} X}

   {FD.distribute ff Distrib}

{ExploreAll Birthday}

Since there is only one solution, sol(3 4 2 1 1), asserting that X is 1, Wok can't be lying.

At least not ALWAYS.

Markus Löckelt