% Solution to the puzzle at
% https://www.brainbashers.com/showpuzzles.asp?puzzle=ZYOT
% Singleton variables left for readability

solution(Q1,Q2,Q3,Q4,Q5) :-
    ans(Q1),ans(Q2),ans(Q3),ans(Q4),ans(Q5),
    q1cons(Q1,Q2,Q3,Q4,Q5),
    q2cons(Q1,Q2,Q3,Q4,Q5),
    q3cons(Q1,Q2,Q3,Q4,Q5),
    q4cons(Q1,Q2,Q3,Q4,Q5),
    q5cons(Q1,Q2,Q3,Q4,Q5).

ans(a). ans(b). ans(c). ans(d).

q1cons(Q1,Q2,Q3,Q4,Q5) :- Q1=a,Q1=b. %could just use false here.
q1cons(Q1,Q2,Q3,Q4,Q5) :- Q1=b,Q4=b,Q3\=b,Q2\=b,Q1\=b.%again, could just use false
q1cons(Q1,Q2,Q3,Q4,Q5) :- Q1=c,Q3=b,Q2\=b.
q1cons(Q1,Q2,Q3,Q4,Q5) :- Q1=d,Q2=b.

q2cons(Q1,Q2,Q3,Q4,Q5) :- Q2=a,Q4=d.
q2cons(Q1,Q2,Q3,Q4,Q5) :- Q2=b,Q4=a.
q2cons(Q1,Q2,Q3,Q4,Q5) :- Q2=c,Q4=b.
q2cons(Q1,Q2,Q3,Q4,Q5) :- Q2=d,Q4=c.

q3cons(Q1,Q2,Q3,Q4,Q5) :- Q3=a,Q1=d.
q3cons(Q1,Q2,Q3,Q4,Q5) :- Q3=b,Q1=c.
q3cons(Q1,Q2,Q3,Q4,Q5) :- Q3=c,Q1=b.
q3cons(Q1,Q2,Q3,Q4,Q5) :- Q3=d,Q1=a.

q4cons(Q1,Q2,Q3,Q4,Q5) :- numMatching(Q1,Q2,Q3,Q4,Q5,d,Ct),q4_sub(Q4,Ct).

q4_sub(a, Ct):- Ct = 3.
q4_sub(b, Ct):- Ct = 2.
q4_sub(c, Ct):- Ct = 1.
q4_sub(d, Ct):- Ct = 0.

q5cons(Q1,Q2,Q3,Q4,Q5) :- numMatching(Q1,Q2,Q3,Q4,Q5,b,Ct),q5_sub(Q5,Ct).

q5_sub(a, Ct):- Ct = 0.
q5_sub(b, Ct):- Ct = 2.
q5_sub(c, Ct):- Ct = 3.
q5_sub(d, Ct):- Ct = 1.

numMatching(Q1,Q2,Q3,Q4,Q5,Val,Ct):-
    oneifEq(Q1,Val,R1),
    oneifEq(Q2,Val,R2),
    oneifEq(Q3,Val,R3),
    oneifEq(Q4,Val,R4),
    oneifEq(Q5,Val,R5),
    Ct is R1+R2+R3+R4+R5.

oneifEq(Q,Val,Res):- Q=Val, Res is 1.
oneifEq(Q,Val,Res):- Q\=Val,Res is 0.  % X\=Y is shorthand for \+X=Y


