couleur(rouge).
couleur(jaune).
couleur(vert).
couleur(bleu).

compte(0, _, []):-!.
compte(N, Couleur, [Couleur|Xs]):-!, compte(N1, Couleur, Xs), N is N1 + 1. 
compte(N, Couleur, [AutreCouleur|Xs]):-!, Couleur \= AutreCouleur, compte(N, Couleur, Xs).

oeufs([rouge, jaune, vert, bleu, rouge, jaune, vert, bleu, rouge, jaune, vert, bleu, rouge, jaune, vert, bleu]).

resoudre([[A, B, C, D], [E, F, G, H], [I, J, K, L], [M, N, O, P]], [C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12], [N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12]):-
    oeufs(Oeufs16),
    select(A, Oeufs16, Oeufs15),
    select(B, Oeufs15, Oeufs14),
    select(C, Oeufs14, Oeufs13),
    select(D, Oeufs13, Oeufs12),
    compte(N2, C2, [A, B, C, D]),
    select(E, Oeufs12, Oeufs11),
    select(F, Oeufs11, Oeufs10),
    select(G, Oeufs10, Oeufs09),
    select(H, Oeufs09, Oeufs08),
    compte(N3, C3, [E, F, G, H]),
    compte(N1, C1, [A, B, C, D, E, F, G, H]),
    select(I, Oeufs08, Oeufs07),
    select(M, Oeufs07, Oeufs06),
    compte(N8, C8, [A, E, I, M]),
    select(J, Oeufs06, Oeufs05),
    select(N, Oeufs05, Oeufs04),
    compte(N9, C9, [B, F, J, N]),
    compte(N7, C7, [A, B, E, F, I, J, M, N]),
    select(K, Oeufs04, Oeufs03),
    select(O, Oeufs03, Oeufs02),
    compte(N11, C11, [C, G, K, O]),
    select(L, Oeufs02, Oeufs01),
    select(P, Oeufs01, []),
    compte(N12, C12, [D, H, L, P]),
    compte(N5, C5, [I, J, K, L]),
    compte(N6, C6, [M, N, O, P]),
    compte(N4, C4, [I, J, K, L, M, N, O, P]),
    compte(N10, C10, [C, D, G, H, K, L, O, P]).

probleme(pb5, [bleu, 1, bleu, 1, vert, 4, bleu, 3, rouge, 1, jaune, 4, bleu, 3, bleu, 2, vert, 1, rouge, 3, jaune, 1, rouge, 2]).
probleme(pb6, [rouge, 2, jaune, 4, bleu, 1, bleu, 3, rouge, 2, bleu, 2, rouge, 2, vert, 1, bleu, 3, rouge, 2, vert, 3, jaune, 1]).
probleme(pb15, [bleu, 3, rouge, 2, bleu, 3, jaune, 4, rouge, 2, jaune, 3, rouge, 4, bleu, 1, jaune, 1, bleu, 3, jaune, 1, jaune, 2]).
convertir(Pb, [C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12], [N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12]):-
    probleme(Pb, [C1, N1, C2, N2, C3, N3, C4, N4, C5, N5, C6, N6,
		  C7, N7, C8, N8, C9, N9, C10, N10, C11, N11, C12, N12]).

solution(NomPb, S):- convertir(NomPb, Couleurs, Nombres), resoudre(S, Couleurs, Nombres), correct(S).

correct([[A, B, C, D], [E, F, G, H], [I, J, K, L], [M, N, O, P]]):-
    compte(4, rouge, [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P]),
    compte(4, vert, [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P]),
    compte(4, bleu, [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P]),
    compte(4, jaune, [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P]).

/**********************************************************************
|-------------------+
| |2|   |   |   |   |
|1|-|---+---+---+---|
| |3|   |   |   |   |
| |-|---+---+---+---|
| |5|   |   |   |   |
|4|-|---+---+---+---|
| |6|   |   |   |   |
|---+---+---+---+---|
    | 8 | 9 | 11| 12|          
    +---+---+---+---+
    |   7   |  10   |
    +---------------+
**********************************************************************/

/* exemple d'utilisation pour résoudre le problème 15 :
lancer prolog
    swipl
charger le fichier
    [colomb4].
demander à résoudre le problème 15 :
solution(pb15, S).
*/
