Problema de Lógica


A linguagem PROLOG é uma excelente ferramenta para resolver problemas de inferência baseados em fatos e regras. Neste caso caem os famosos problemas de lógica das revistas de passatempo. Vejamos um destes problemas e sua solução em Prolog.

English version

Relaxando com a Lógica


As cinco mulheres deste passatempo costumam relaxar resolvendo um ou dois problemas de logica por dia, apesar de terem vidas bastante ocupadas. Em um desses disa, elas pararam para relaxar em horarios e lugares diferentes. Pelas dicas dadas, relacione as mulheres as suas ocupacoes e diga quando e onde pararam para resolver seus problemas de logica.

1- A estudante comecou seu dia com ma sessao de problemas de logica as 9h da manha.
2- A pausa dada por Benta aconteceu mais tarde que o da mulher que trabalha como autonoma.
3- Mara resolveu seus problemas em um jardim em um horario mais cedo que a mlher que e diretora de uma grande empresa (que nao e Odete).
4- Marcela trabalha como vendedora de cosmeticos; ela fez sua pausa imediatamente antes de Odete.
5- Uma das mulheres, mas nao Odete, exercitou sua capacidade durante o cafe da manha em uma lanchonete.
6- Rute escolheu a hora do almoco para relaxar, comecando as 13h.
7- A gerente de banco levou seus problemas de logica para o parque. Uma pessoa foi a um restaurante as 18h para relaxar resolvendo problemas de logica.

Os nomes, ocupacoes, horarios e lugares sao mutuamente exclusivos:
Nomes: Benta, Mara, Marcela, Odete e Rute
Ocupações: diretora, gerente, autônoma, vendedora e estudante.
Horários: 8h, 9h, 13h, 16h e 18h.
Lugares: lanchonete, restaurante, jardim, cozinha e parque.

(*) Revista Problemas de Lógica, Coquetel, n. 90, pag. 20 (ISSN 1517-0837).

Solução em Prolog


Bom, para saber a solução deste problema você deve implementar o código abaixo e rodar em um interpretador Prolog - ou comprar a revista em questão! :)

Uma maneira de resolver é utilizando listas e restringindo as possibilidades de soluções para cada dica considerada. A estrutura de dados do programa conta com uma lista de 5 elementos, que são, pela ordem, as características das pessoas:
[ListaBenta, ListaMara, ListaMarcela, ListaOdete, ListaRute]=Lista
Cada um destes 5 elementos é uma sublista com 3 características, também ordenadas. Por exemplo, ListaBenta ou qualquer outra, contém:
[Ocupacao, Horario, Lugar]=ListaBenta

O programa inicia chamando o predicado resolve(X) que gera em X uma lista de todas as possiveis combinações válidas, sem repetição, dadas pelo predicado solucao(X).

Após X conter a lista de todas possíveis soluções, cada predicado itemN(X) irá eliminar desta lista as soluções incompatíveis com a informação que neles estão codificadas.

Ao final de todos os itens, a lista X se resumirá a uma única solução para o problema.

Código completo da solução em Prolog


Salve o código abaixo com o nome: ocupacao-hora-lugar.pl. Para sistemas linux, autorize sua execução (chmod +x ocupacao-hora-lugar.pl) e rode como script.

Download do código fonte:
Portugues:
Ingles:
For an English version of this page, click here.

Código fonte:

#!/usr/bin/pl -t resolve(X) -q -f none -s
 
%Prof. Dr. Ruben Carlo Benante (benante @ gmail.com)
%Solucao para problema de logica utilizando a linguagem PROLOG
%Problemas de logica - Revista Coquetel, n. 90, pag. 20 (ISSN 1517-0837)
%Arquivo: ocupacao-hora-lugar.pl
 
%As cinco mulheres deste passatempo costumam relaxar resolvendo um ou
%dois problemas de logica por dia, apesar de terem vidas bastante
%ocupadas. Em um desses disa, elas pararam para relaxar em horarios e lugares
%diferentes. Pelas dicas dadas, relacione as mulheres as suas ocupacoes e diga
%quando e onde pararam para resolver seus problemas de logica.
 
%1- A estudante comecou seu dia com ma sessao de problemas de logica
%as 9h da manha.
%2- A pausa dada por Benta aconteceu mais tarde que o da mulher que
%trabalha como autonoma.
%3- Mara resolveu seus problemas em um jardim em um horario mais cedo
%que a mlher que e diretora de uma grande empresa (que nao e Odete).
%4- Marcela trabalha como vendedora de cosmeticos; ela fez sua pausa
%imediatamente antes de Odete.
%5- Uma das mulheres, mas nao Odete, exercitou sua capacidade durante o
%cafe da manha em uma lanchonete.
%6- Rute escolheu a hora do almoco para relaxar, comecando as 13h.
%7- A gerente de banco levou seus problemas de logica para o parque. Uma
%pessoa foi a um restaurante as 18h para relaxar resolvendo problemas de logica.
 
%Os nomes, ocupacoes, horarios e lugares sao mutuamente exclusivos:
%Nomes: Benta, Mara, Marcela, Odete e Rute
%Ocupacoes: diretora, gerente, autonoma, vendedora e estudante.
%Horarios: 8h, 9h, 13h, 16h e 18h
%Lugares: lanchonete, restaurante, jardim, cozinha e parque
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Altere esta parte para resolver um novo problema
 
indicenome(nome).
indicea(benta).     %a
indiceb(mara).      %b
indicec(marcela).   %c
indiced(odete).     %d
indicee(rute).      %e
 
car1nome(ocupacao).
car1(diretora).
car1(gerente).
car1(autonoma).
car1(vendedora).
car1(estudante).
 
car2nome(hora).
car2(8).
car2(9).
car2(13).
car2(16).
car2(18).
 
car3nome(lugar).
car3(lanchonete).
car3(restaurante).
car3(jardim).
car3(cozinha).
car3(parque).
 
%lista de nomes x 5= [Lbenta,Lmara,Lmarcela,Lodete,Lrute]
%cada lista de nomes contém uma lista de caracteristicas x 3=[ocupacao,hora,lugar]
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%inicio das dicas:
 
%estudante fez as 9h
item1(Listas) :-
    member(Lalguem,Listas),
    [estudante,9,_]=Lalguem.
 
%Benta parou mais tarde que a autonoma
item2(Listas) :-
    [Lbenta,_,_,_,_]=Listas,
    member(Lalguem,Listas),
    [autonoma,HoraAutonoma,_]=Lalguem,
    not(Lbenta=Lalguem),
    [_,HoraBenta,_]=Lbenta,
    HoraBenta > HoraAutonoma.
 
%Mara resolveu no jardim
item3([_,[_,_,jardim],_,_,_]).
 
%Mara resolveu mais cedo que a diretora
item4(Listas) :-
    [_,Lmara,_,_,_]=Listas,
    [OcupaMara,HoraMara,_]=Lmara,
    member(Lalguem,Listas),
    not(Lalguem=Lmara),
    [diretora,HoraDiretora,_]=Lalguem,
    not(OcupaMara=diretora),
    HoraMara < HoraDiretora.
 
%Odete nao e diretora
item5([_,_,_,Lodete,_]) :-
    not([diretora,_,_]=Lodete).
 
%Marcela trabalha como vendedora.
item6([_,_,[vendedora,_,_],_,_]).
 
%marcela fez sua pausa imediatamente antes de odete!
item7(Listas) :-
    [_,_,Lmarcela,Lodete,_]=Listas,
    [_,HoraMarcela,_]=Lmarcela,
    [_,HoraOdete,_]=Lodete,
    HoraMarcela=8,
    HoraOdete=9.
 
%ou
item7(Listas) :-
    [_,_,Lmarcela,Lodete,_]=Listas,
    [_,HoraMarcela,_]=Lmarcela,
    [_,HoraOdete,_]=Lodete,
    HoraMarcela=9,
    HoraOdete=13.
 
%ou
item7(Listas) :-
    [_,_,Lmarcela,Lodete,_]=Listas,
    [_,HoraMarcela,_]=Lmarcela,
    [_,HoraOdete,_]=Lodete,
    HoraMarcela=13,
    HoraOdete=16.
 
%ou
item7(Listas) :-
    [_,_,Lmarcela,Lodete,_]=Listas,
    [_,HoraMarcela,_]=Lmarcela,
    [_,HoraOdete,_]=Lodete,
    HoraMarcela=16,
    HoraOdete=18.
 
%Odete nao se exercitou na lanchonete
item8([_,_,_,[_,_,LugarOdete],_]) :-
    not(LugarOdete=lanchonete).
 
%Rute relaxou as 13h
item9([_,_,_,_,[_,13,_]]).
 
%gerente foi ao parque
item10(Listas) :-
    member([gerente,_,parque],Listas).
 
%a pessoa do restaurante iniciou as 18h
item11(Listas) :-
    member([_,18,restaurante],Listas).
 
item12(_).
item13(_).
item14(_).
item15(_).
item16(_).
item17(_).
item18(_).
item19(_).
item20(_).
 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Nao altere daqui para baixo !!!
 
solucao([[Car1a, Car2a, Car3a],[Car1b, Car2b, Car3b],[Car1c, Car2c, Car3c],
[Car1d, Car2d, Car3d],[Car1e, Car2e, Car3e]]) :-
            car1(Car1a),
            car1(Car1b),
            not(Car1a=Car1b),
            car1(Car1c),
            not(Car1a=Car1c),
            not(Car1b=Car1c),
            car1(Car1d),
            not(Car1a=Car1d),
            not(Car1b=Car1d),
            not(Car1c=Car1d),
            car1(Car1e),
            not(Car1a=Car1e),
            not(Car1b=Car1e),
            not(Car1c=Car1e),
            not(Car1d=Car1e),
            car2(Car2a),
            car2(Car2b),
            not(Car2a=Car2b),
            car2(Car2c),
            not(Car2a=Car2c),
            not(Car2b=Car2c),
            car2(Car2d),
            not(Car2a=Car2d),
            not(Car2b=Car2d),
            not(Car2c=Car2d),
            car2(Car2e),
            not(Car2a=Car2e),
            not(Car2b=Car2e),
            not(Car2c=Car2e),
            not(Car2d=Car2e),
            car3(Car3a),
            car3(Car3b),
            not(Car3a=Car3b),
            car3(Car3c),
            not(Car3a=Car3c),
            not(Car3b=Car3c),
            car3(Car3d),
            not(Car3a=Car3d),
            not(Car3b=Car3d),
            not(Car3c=Car3d),
            car3(Car3e),
            not(Car3a=Car3e),
            not(Car3b=Car3e),
            not(Car3c=Car3e),
            not(Car3d=Car3e).
 
resolve([[Car1a, Car2a, Car3a],[Car1b, Car2b, Car3b],[Car1c, Car2c, Car3c],
[Car1d, Car2d, Car3d],[Car1e, Car2e, Car3e]]) :-
    X=[[Car1a, Car2a, Car3a],[Car1b, Car2b, Car3b],[Car1c, Car2c, Car3c],
[Car1d, Car2d, Car3d],[Car1e, Car2e, Car3e]],
    solucao(X),
    item1(X),
    item2(X),
    item3(X),
    item4(X),
    item5(X),
    item6(X),
    item7(X),
    item8(X),
    item9(X),
    item10(X),
    item11(X),
    item12(X),
    item13(X),
    item14(X),
    item15(X),
    item16(X),
    item17(X),
    item18(X),
    item19(X),
    item20(X),
    indicea(Ia),
    indiceb(Ib),
    indicec(Ic),
    indiced(Id),
    indicee(Ie),
    indicenome(Indicenome),
    car1nome(Car1nome),
    car2nome(Car2nome),
    car3nome(Car3nome),
    writef('%w %w %w %w\n',[Indicenome, Car1nome, Car2nome, Car3nome]),
    writef('%w %w %w %w\n',[Ia, Car1a, Car2a, Car3a]),
    writef('%w %w %w %w\n',[Ib, Car1b, Car2b, Car3b]),
    writef('%w %w %w %w\n',[Ic, Car1c, Car2c, Car3c]),
    writef('%w %w %w %w\n',[Id, Car1d, Car2d, Car3d]),
    writef('%w %w %w %w\n',[Ie, Car1e, Car2e, Car3e]).