Public feed #724381

JabberPaste

public text v1 · immutable
Raw Edit
·published 2007-10-03 15:30 UTC
rendered paste body
% 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].