declare
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
in
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}
end
{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.