segunda-feira, 25 de abril de 2011

Prolog 2

Esse exemplo é do Coquetel Desafio Super #194 (Jan. 2011):

1. O(A) funcionário(a) da limpeza é voluntário na biblioteca.
2. Tiago trabalha como voluntário um dia antes na semana que o(a) voluntário(a) do centro juvenil, mas dois dias depois da pessoa de sobrenome Toledo.
3. Jane é voluntária na creche e faz esse trabalho um dia depois da pessoa de sobrenome Fontes, mas dois dias antes do motorista.
4. A pessoa de sobrenome Branco faz um trabalho voluntário no centro comunitário um dia antes de Pablo, mas dois dias depois da pessoa cuja atividade é contar histórias.
5. Catarina Martins faz um trabalho voluntário dois dias antes na semana que a pessoa que trabalha no setor de esportes. Roberval não é a pessoa que ajuda voluntariamente o asilo.

Código prolog:

um_antes(A, B, [A | [B | _]]).
um_antes(A, B, [_ | X]) :- um_antes(A, B, X).

dois_antes(A, B, X) :-
  um_antes(A, C, X),
  um_antes(C, B, X).

solve(Dias) :-
  Dias = [Segunda, Terca, Quarta, Quinta, Sexta],
  member(dia(_, _, limpeza, biblioteca), Dias),
  um_antes(dia(tiago, _, _, _), dia(_, _, _, juvenil), Dias),
  dois_antes(dia(_, toledo, _, _), dia(tiago, _, _, _), Dias),
  um_antes(dia(_, fontes, _, _), dia(jane, _, _, creche), Dias),
  dois_antes(dia(jane, _, _, _), dia(_, _, motorista, _), Dias),
  um_antes(dia(_, branco, _, comunitario), 

           dia(pablo, _, _, _), Dias),
  dois_antes(dia(_, _, contar_historias, _), 

             dia(_, branco, _, _), Dias),
  dois_antes(dia(catarina, martins, _, _),

             dia(_, _, esportes, _), Dias),
  \+member(dia(roberval, _, _, asilo), Dias),
  member(dia(roberval, _, _, _), Dias),
  member(dia(_, costa, _, _), Dias),
  member(dia(_, _, _, asilo), Dias),
  member(dia(_, _, coordenacao, _), Dias).


Solução:


?- solve(K).

K = [dia(roberval, fontes, limpeza, biblioteca), dia(jane, toledo, contar_historias, creche), dia(catarina, martins, coordenacao, asilo), dia(tiago, branco, motorista, comunitario), dia(pablo, costa, esportes, juvenil)] ;




Prolog 1

Eu estava à toa no domingo à noite e resolvi aprender Prolog. Descobri que é muito imediato resolver probleminhas de lógica da coquetel com ele. Veja a solução desse aqui (que eu gerei com um gerador automático de zebra puzzles).

Três casas, onde moram o noruegues, o alemao e o suico; as casas são branca, cinza e rosa; eles bebem espresso, chá e leite. Regras:

The Norwegian drinks espresso.
The Swiss lives in house one.
The third house is not white.
The Swiss drinks icetea.
The person in house two drinks espresso.
The first house is pink.

Solução em prolog:

solve(K) :-
  K = [A, B, C],
  member(house(_, espresso, norwegian), K),
  A = house(_, _, swiss),
  member(house(_, icetea, swiss), K),
  member(house(gray, _, _), K),
  member(house(white, _, _), K),
  member(house(_, _, german), K),
  member(house(_, milk, _), K),
  \+C = house(white, _, _),
  B = house(_, espresso, _),
  A = house(pink, _, _).


Resultado:

?- solve(K).
K = [house(pink, icetea, swiss), house(white, espresso, norwegian), house(gray, milk, german)] .


Pra programar em prolog o jeito mais fácil é reduzir seu problema a um puzzle :)