nti1:-cls,create_popup(' 1§ NTI de LP III ',(3,25),(18,56),(2,7)),
      nl,write('          Op‡„o : '),nl,nl,write('   1 - Inser‡„o Direta'),nl,
      write('   2 - Sele‡„o Direta'),nl,write('   3 - Troca Direta'),nl,
      write('   4 - Problema das Rainhas'),nl,write('   5 - Interse‡„o'),nl,
      write('   6 - Complementar'),nl,write('   7 - Imprime Lista'),nl,
      write('   8 - Sa¡da'),opcao,exit_popup,cls.

opcao:-tmove(1,18),get0(Letra),case([Letra=49 -> insercao,Letra=50 -> selecao,
       Letra=51 -> troca,Letra=52 -> rainha,Letra=53 -> intersecao,
       Letra=54 -> complementar,Letra=55 -> imprime]),Letra\=56,opcao.
opcao.

recebe(Label,Lista,Nlista):-create_popup(Label,(5,2),(19,28),(1,5)),
                      nl,write(' (fim p/ parar)'),nl,recebe1(Lista,Nlista).

recebe1(Lista,[Num|Nlista]):-read(Num),Num\=fim,recebe1(Lista,Nlista).
recebe1(Lista,[]).

mostra(Label,Lista):-create_popup(Label,(5,50),(19,76),(3,8)),
                      mostra1(Lista),get0_noecho(N),exit_popup.

mostra1([Cb|Cd]):-write(Cb),nl,mostra1(Cd).
mostra1([]).

membro(X,[X|_]).
membro(X,[_|Cd]):-membro(X,Cd).

insercao:-recebe(' Entre a Lista ',[],Lista),insere(Lista,[],Nlista),
          mostra(' Lista Ordenada ',Nlista),exit_popup.

insere([],Lista,Lista).
insere([Cb|Cd],L1,Nlista):-ordene(Cb,L1,L2),insere(Cd,L2,Nlista).

ordene(X,[],[X]).
ordene(X,[Cb|Cd],[X,Cb|Cd]):-X<Cb.
ordene(X,[Cb|Cd],[Cb|Lista]):-ordene(X,Cd,Lista).

selecao:-recebe(' Entre a Lista ',[],Lista),
         selecao(Lista,Nlista),mostra(' Lista Ordenada ',Nlista),exit_popup.

selecao([],[]).
selecao([],[Cb|Cd]).
selecao([Cb|Cd],[X|Nl]):-menor(Cd,X),X<Cb,troca(X,Cb,Cd,L),selecao(L,Nl).
selecao([Cb|Cd],[Cb|Nlista]):-selecao(Cd,Nlista).

menor([Cb|Cd],X):-Cd\=[],menor(Cd,X),X<Cb.
menor([Cb|Cd],Cb).

troca(Menor,Cb,[Menor|Cd],[Cb|Cd]).
troca(Menor,Cb1,[Cb|Cd],[Cb|Lista]):-troca(Menor,Cb1,Cd,Lista).

troca:-recebe(' Entre a Lista ',[],Lista),bolha1(Lista,Nlista),
       mostra(' Lista Ordenada ',Nlista),exit_popup.

bolha1(L,Lista1):-bolha(L,Nlista,0,Flag),Flag\=0,bolha1(Nlista,Lista1).
bolha1(Lista,Lista).

bolha([],[],Flag,Flag).
bolha([Cb|[Cb1|Cd]],[Cb1|Nlista],Flag,Flag1):-Cb1<Cb,Flag1 is 1,
                                 bolha([Cb|Cd],Nlista,Flag,Flag2).
bolha([Cb|Cd],[Cb|Nlista],Flag,Flag1):-bolha(Cd,Nlista,Flag,Flag1).

rainha:-create_popup(' Problema das Rainhas ',(5,50),(11,76),(3,8)),nl,
           write(' N£mero de Rainhas : '),get(T),Num is T-48,Meio is Num/2,
           cria_pos(Num),cria_pos1(Meio,1),asserta(sol(1)),
           findall(X,rainha(Num,X),Lista),abolish(conf/1),
           abolish(pos/1),abolish(pos1/1),abolish(sol/1),exit_popup.

rainha(Num,X):-pos1(Pos),rainha(2,Num,[Pos],Nl),Nl\=[],[!testa(Nl,Num)!],
       retract(sol(Sol)),mostra2(Sol,Nl,Num),Sol1 is Sol+1,asserta(sol(Sol1)).

rainha(Linha,Total,Lista,Lista):-Linha>Total.
rainha(Linha,Total,L,Nl):-Linha=<Total,pos(Pos),
     acha_posicao(Total,Pos,L,Pos1),L1 is Linha+1,rainha(L1,Total,[Pos1|L],Nl).

testa(Lista,Num):-not(conf(Lista)),asserta(conf(Lista)),inv0(Lista,Num,L1),
               inclui(L1),inv90(Lista,Num,L2),inclui(L2),inv180(Lista,L3),
               inclui(L3),inv270(Lista,Num,Num,L4),inclui(L4),
               rot90(Lista,Num,Num,L5),inclui(L5),rot180(Lista,Num,L6),
               inclui(L6),rot270(Lista,Num,L7),inclui(L7).

inclui(Lista):-not(conf(Lista)),asserta(conf(Lista)).
inclui(Lista).

inv0([Cb|[]],Num,[Inv]):-Inv is Num-Cb+1.
inv0([Cb|Cd],Num,[Inv|Nl]):-Inv is Num-Cb+1,inv0(Cd,Num,Nl).

inv90(_,0,[]).
inv90(Lista,Num,Nl):-lugar(Num,Lista,1,Lugar),Num1 is Num-1,
               inv90(Lista,Num1,L1),junte(L1,[Lugar],Nl).

inv180([Cb|[]],[Cb]).
inv180([Cb|Cd],Nl):-inv180(Cd,L1),junte(L1,[Cb],Nl).

inv270(_,0,_,[]).
inv270(Lista,Num,X,[Inv|Nl]):-lugar(Num,Lista,1,Lugar),Inv is X-Lugar+1,
                 Num1 is Num-1,inv270(Lista,Num1,X,Nl).

rot90(_,0,_,[]).
rot90(Lista,Num,X,Nl):-lugar(Num,Lista,1,Lugar),Inv is X-Lugar+1,
                 Num1 is Num-1,rot90(Lista,Num1,X,L1),junte(L1,[Inv],Nl).

rot180([Cb|[]],Num,[Inv]):-Inv is Num-Cb+1.
rot180([Cb|Cd],Num,Nl):-rot180(Cd,Num,L1),Inv is Num-Cb+1,junte(L1,[Inv],Nl).

rot270(_,0,[]).
rot270(Lista,Num,[Lugar|Nl]):-lugar(Num,Lista,1,Lugar),Num1 is Num-1,
               rot270(Lista,Num1,Nl).

lugar(Num,[Num|_],X,X):-!.
lugar(Num,[Cb|Cd],Pos,X):-Num\=Cb,Pos1 is Pos+1,lugar(Num,Cd,Pos1,X).

junte([],L2,L2).
junte([Cb|Cd],L2,[Cb|L3]):-junte(Cd,L2,L3).

cria_pos(Num):-Num>0,Num1 is Num-1,asserta(pos(Num)),cria_pos(Num1).
cria_pos(Num).
cria_pos1(Num,Pos):-Num>0,Num1 is Num-1,assertz(pos1(Pos)),Pos1 is Pos+1,
                    cria_pos1(Num1,Pos1).
cria_pos1(Num,Pos).

acha_posicao(X,Pos,Lista,Pos1):-!,Pos=<X,not(membro(Pos,Lista)),
           antecessor(1,Pos,Lista),sucessor(1,Pos,Lista),Pos1 is Pos.
acha_posicao(X,Pos,Lista,Pos1):-!,Pos2 is Pos+1,Pos2=<X,
           acha_posicao(X,Pos2,Lista,Pos1).

antecessor(Nivel,Pos,[]).
antecessor(Nivel,Pos,[Cb|Cd]):-!,Nao is Cb-Nivel,Pos\=Nao,Nivel1 is Nivel+1,
             antecessor(Nivel1,Pos,Cd).

sucessor(Nivel,Pos,[]).
sucessor(Nivel,Pos,[Cb|Cd]):-!,Nao is Cb+Nivel,Pos\=Nao,Nivel1 is Nivel+1,
             sucessor(Nivel1,Pos,Cd).

mostra2(Sol,L1,X):-L is X*2+5,C is X*4+11,create_popup('',(1,3),(L,C),(3,8)),
                  write(' Solu‡„o '),write(Sol),nl,tget(Lin,Col),tab1(X),
                  tmove(Lin,Col),nl,mostra3(L1),get0_noecho(Z),exit_popup.

mostra3([Cb|Cd]):-mostra3(Cd),tget(Lin,Col),Col1 is Cb*4-2,tmove(Lin,Col1),
             write('D'),nl,nl.
mostra3([]).

tab1(X):-linha1(X),X1 is X-1,X1>0,tab2(X,X1).
tab1(X):-linha2(X),linha4(X).

tab2(X,X1):-linha2(X),linha3(X),X2 is X1-1,X2>0,tab2(X,X2).

linha1(X):-write('Ú'),X1 is X-1,X1>0,col1(X1),write('ÄÄÄ¿'),nl.
linha1(X):-write('ÄÄÄ¿'),nl.

col1(X):-write('ÄÄÄÂ'),X1 is X-1,!,X1>0,col1(X1).

linha2(X):-write('³'),X1 is X-1,X1>0,col2(X1),write('   ³'),nl.
linha2(X):-write('   ³'),nl.

col2(X):-write('   ³'),X1 is X-1,!,X1>0,col2(X1).

linha3(X):-write('Ã'),X1 is X-1,X1>0,col3(X1),write('ÄÄÄ´'),nl.
linha3(X):-write('ÄÄÄ´'),nl.

col3(X):-write('ÄÄÄÅ'),X1 is X-1,!,X1>0,col3(X1).

linha4(X):-write('À'),X1 is X-1,X1>0,col4(X1),write('ÄÄÄÙ'),nl.
linha4(X):-write('ÄÄÄÙ'),nl.

col4(X):-write('ÄÄÄÁ'),X1 is X-1,!,X1>0,col4(X1).

intersecao:-recebe(' Entre o 1§ conjunto ',[],Lista1),
            recebe(' Entre o 2§ conjunto ',[],Lista2),
            inter(Lista1,Lista2,Lista3),mostra(' Interse‡„o ',Lista3),
            exit_popup,exit_popup.

inter([],_,[]).
inter([Cb|Cd],L,[Cb|Nl]):-membro(Cb,L),inter(Cd,L,Nl),not(membro(Cb,Nl)).
inter([Cb|Cd],Lista,Nlista):-inter(Cd,Lista,Nlista).

complementar:-recebe(' Entre o 1§ conjunto ',[],L1),
              recebe(' Entre o 2§ conjunto ',[],L2),compl(L1,L2,L3),
              mostra(' Complementar ',L3),exit_popup,exit_popup.

compl([],_,[]).
compl([Cb|Cd],L,[Cb|Nl]):-not(membro(Cb,L)),compl(Cd,L,Nl),not(membro(Cb,Nl)).
compl([Cb|Cd],Lista,Nlista):-compl(Cd,Lista,Nlista).

imprime:-recebe(' Entre a lista ',[],Lista),
         create_popup(' Impress„o por N¡vel',(5,50),(19,76),(3,8)),
         impri(2,Lista),get0_noecho(N),exit_popup,exit_popup.

e_lista([Cb|Cd]).
e_lista([]).

impri(_,[]).
impri(Nivel,[Cb|Cd]):-not(e_lista(Cb)),tget(L,C),C1 is C+Nivel,tmove(L,C1),
                      write(Cb),nl,impri(Nivel,Cd).
impri(Nivel,[Cb|Cd]):- X1 is Nivel + 2, impri(X1,Cb),impri(Nivel,Cd).
