/* properties and values */ husband(paul). husband(rob). husband(stan). husband(vern). husband(wally). day(1). day(2). day(3). day(4). day(5). /* constraints */ a(anne, 1). b(anne, X) :- X \= wally. c(stan, 3). d(rob, 5). e(rob, X) :- X \= ida. f(vern, fran). g(vern, X, eve, Y) :- X is Y + 1. /* solve predicate */ solve(Wife1,Husband1,Day1, Wife2,Husband2,Day2, Wife3,Husband3,Day3, Wife4,Husband4,Day4, Wife5,Husband5,Day5) :- /* freeze first property */ Wife1 = anne, Wife2 = cathy, Wife3 = eve, Wife4 = fran, Wife5 = ida, /* make values of other properties distinct */ husband(Husband1), husband(Husband2), husband(Husband3), husband(Husband4), husband(Husband5), Husband1 \= Husband2, Husband1 \= Husband3, Husband1 \= Husband4, Husband1 \= Husband5, Husband2 \= Husband3, Husband2 \= Husband4, Husband2 \= Husband5, Husband3 \= Husband4, Husband3 \= Husband5, Husband4 \= Husband5, day(Day1), day(Day2), day(Day3), day(Day4), day(Day5), Day1 \= Day2, Day1 \= Day3, Day1 \= Day4, Day1 \= Day5, Day2 \= Day3, Day2 \= Day4, Day2 \= Day5, Day3 \= Day4, Day3 \= Day5, Day4 \= Day5, /* assert constraints */ ( a(Wife1, Day1); a(Wife2, Day2); a(Wife3, Day3); a(Wife4, Day4); a(Wife5, Day5) ), ( b(Wife1, Husband1); b(Wife2, Husband2); b(Wife3, Husband3); b(Wife4, Husband4); b(Wife5, Husband5) ), ( c(Husband1, Day1); c(Husband2, Day2); c(Husband3, Day3); c(Husband4, Day4); c(Husband5, Day5) ), ( d(Husband1, Day1); d(Husband2, Day2); d(Husband3, Day3); d(Husband4, Day4); d(Husband5, Day5) ), ( e(Husband1, Wife1); e(Husband2, Wife2); e(Husband3, Wife3); e(Husband4, Wife4); e(Husband5, Wife5) ), ( f(Husband1, Wife1); f(Husband2, Wife2); f(Husband3, Wife3); f(Husband4, Wife4); f(Husband5, Wife5) ), ( g(Husband1, Day1, Wife1, Day1); g(Husband1, Day1, Wife2, Day2); g(Husband1, Day1, Wife3, Day3); g(Husband1, Day1, Wife4, Day4); g(Husband1, Day1, Wife5, Day5); g(Husband2, Day2, Wife1, Day1); g(Husband2, Day2, Wife2, Day2); g(Husband2, Day2, Wife3, Day3); g(Husband2, Day2, Wife4, Day4); g(Husband2, Day2, Wife5, Day5); g(Husband3, Day3, Wife1, Day1); g(Husband3, Day3, Wife2, Day2); g(Husband3, Day3, Wife3, Day3); g(Husband3, Day3, Wife4, Day4); g(Husband3, Day3, Wife5, Day5); g(Husband4, Day4, Wife1, Day1); g(Husband4, Day4, Wife2, Day2); g(Husband4, Day4, Wife3, Day3); g(Husband4, Day4, Wife4, Day4); g(Husband4, Day4, Wife5, Day5); g(Husband5, Day5, Wife1, Day1); g(Husband5, Day5, Wife2, Day2); g(Husband5, Day5, Wife3, Day3); g(Husband5, Day5, Wife4, Day4); g(Husband5, Day5, Wife5, Day5) ). /* go/0 predicate, prints all solutions */ go :- solve(Wife1,Husband1,Day1, Wife2,Husband2,Day2, Wife3,Husband3,Day3, Wife4,Husband4,Day4, Wife5,Husband5,Day5), /* print a solution */ write(Wife1), write('\t'), write(Husband1), write('\t'), write(Day1), write('\n'), write(Wife2), write('\t'), write(Husband2), write('\t'), write(Day2), write('\n'), write(Wife3), write('\t'), write(Husband3), write('\t'), write(Day3), write('\n'), write(Wife4), write('\t'), write(Husband4), write('\t'), write(Day4), write('\n'), write(Wife5), write('\t'), write(Husband5), write('\t'), write(Day5), write('\n'), /* backtrack for all solutions */ write('\n'), fail.