% palavras que podem ser usadas
% para preencher a grade.

palavra([b,a,i,x,o]).
palavra([b,e,i,j,o]).
palavra([b,o,t,o]).
palavra([c,a,i,x,a]).
palavra([e,l,o]).
palavra([o,c,a]).
palavra([o,i,t,o]).
palavra([o,l,h,o]).
palavra([t,i,a]).
palavra([u,v,a]).

% descreve as características da
% solução desejada para o problema.

cruzadas1(Grade) :-
   Grade = [[A, B, C, D, E],
            [F, *, *, *, G],
            [H, *, I, J, K],
            [L, *, *, *, *],
            [M, N, O, P, *]],
   palavra([A,B,C,D,E]),
   palavra([A,F,H,L,M]),
   palavra([E,G,K]),
   palavra([I,J,K]),
   palavra([M,N,O,P]),
   [A,B,C,D,E] \= [A,F,H,L,M],
   [I,J,K] \= [E,G,K].

cruzadas2(Grade) :-
   Grade = [[A, B, C, D, E],
            [F, *, *, *, G],
            [H, *, I, J, K],
            [L, *, *, *, *],
            [M, N, O, P, *]],
   palavra([A,B,C,D,E]),
   palavra([A,F,H,L,M]),
   [A,B,C,D,E] \= [A,F,H,L,M],
   palavra([E,G,K]),
   palavra([I,J,K]),
   [I,J,K] \= [E,G,K],
   palavra([M,N,O,P]).

% Medir e comparar os tempos
% time(forall(cruzadas1(Grade), true)).
% time(forall(cruzadas2(Grade), true)).

mostra_matrix(Matrix) :-
    nl,
    maplist(mostra_linha, Matrix),
    nl.

mostra_linha(Linha) :-
    maplist(mostra_casa, Linha),
    nl.

mostra_casa(*) :- !,
    ansi_format([bg(black)], '   ', []).

mostra_casa(Letra) :-
    ansi_format([bg(white), fg(red), bold], ' ~w ', [Letra]).

resolva :-
    cruzadas2(Solução),
    mostra_matrix(Solução).


