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.