% 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].