Public feed
#724381
% figures: ariel, triton, eric and scuttle
% card syntax:
% card(left,top,right,bottom,card#,rot)
% all cards:
card(lower(ariel), lower(eric), upper(ariel), upper(scuttle), 1, 0).
card(lower(ariel), lower(scuttle), upper(eric), upper(ariel), 2, 0).
card(upper(ariel), lower(ariel), lower(scuttle), upper(triton), 3, 0).
card(upper(scuttle), lower(eric), lower(ariel), upper(eric), 4, 0).
card(upper(ariel), lower(eric), lower(scuttle), upper(triton), 5, 0).
card(upper(scuttle), lower(eric), lower(ariel), upper(triton), 6, 0).
card(lower(ariel), upper(scuttle), upper(ariel), lower(eric), 7, 0).
card(lower(ariel), lower(scuttle), upper(eric), upper(ariel), 8, 0).
card(lower(ariel), lower(ariel), upper(scuttle), upper(eric), 9, 0).
% all possible spins of card N
card(D,A,B,C,N,1) :- card(A,B,C,D,N,0).
card(D,A,B,C,N,2) :- card(A,B,C,D,N,1).
card(D,A,B,C,N,3) :- card(A,B,C,D,N,2).
% which parts fit?
fitpart(upper(X), lower(X)).
fitpart(lower(X), upper(X)).
% cards fitting
fith(card(_,_,A,_,_,_), card(B,_,_,_,_,_)) :- fitpart(A, B).
fitv(card(_,_,_,A,_,_), card(_,B,_,_,_,_)) :- fitpart(A, B).
fith(X,Y,Z) :- fith(X,Y), fith(Y,Z).
fitv(X,Y,Z) :- fitv(X,Y), fitv(Y,Z).
correctrow(A,B,C,L,R) :-
select(NA, L, L1),
select(NB, L1, L2),
select(NC, L2, R),
A = card(_,_,_,_,NA,_), A,
B = card(_,_,_,_,NB,_), B,
C = card(_,_,_,_,NC,_), C,
NA \= NB, NB \= NC, NC \= NA,
fith(A,B,C).
correctcol(A,B,C) :-
A = card(_,_,_,_,NA,_), A,
B = card(_,_,_,_,NB,_), B,
C = card(_,_,_,_,NC,_), C,
NA \= NB, NB \= NC, NC \= NA,
fitv(A,B,C).
solution(L) :-
L1 = [1,2,3,4,5,6,7,8,9],
correctrow(A,B,C,L1,L2),
correctrow(D,E,F,L2,L3),
correctrow(G,H,I,L3,_),
correctcol(A,D,G),
correctcol(B,E,H),
correctcol(C,F,I),
A,B,C,D,E,F,G,H,I,
L = [A,B,C,D,E,F,G,H,I].