/* properties and values */ girl(red). girl(green). girl(blue). /* constraints */ a(red, green). c(red, X) :- X \= red. d(green, X) :- X \= green. e(blue, X) :- X \= blue. /* solve predicate */ solve(Boy1,Girl1, Boy2,Girl2, Boy3,Girl3) :- /* freeze first property */ Boy1 = red, Boy2 = green, Boy3 = blue, /* make values of other properties distinct */ girl(Girl1), girl(Girl2), girl(Girl3), Girl1 \= Girl2, Girl1 \= Girl3, Girl2 \= Girl3, /* assert constraints */ ( a(Boy1, Girl1); a(Boy2, Girl2); a(Boy3, Girl3) ), ( c(Boy1, Girl1); c(Boy2, Girl2); c(Boy3, Girl3) ), ( d(Boy1, Girl1); d(Boy2, Girl2); d(Boy3, Girl3) ), ( e(Boy1, Girl1); e(Boy2, Girl2); e(Boy3, Girl3) ). /* go/0 predicate, prints all solutions */ go :- solve(Boy1,Girl1, Boy2,Girl2, Boy3,Girl3), /* print a solution */ write(Boy1), write('\t'), write(Girl1), write('\n'), write(Boy2), write('\t'), write(Girl2), write('\n'), write(Boy3), write('\t'), write(Girl3), write('\n'), /* backtrack for all solutions */ write('\n'), fail.