Mostrando postagens com marcador prolog. Mostrar todas as postagens
Mostrando postagens com marcador prolog. Mostrar todas as postagens

domingo, 1 de maio de 2011

Prolog 3

Esse puzzle deu mais trabalho, porque as regras não definem unicamente uma solução, você também precisa impor que não existem dois boxeadores com o mesmo atributo.

1. Marcelo teve 4 nocautes.
2. O boxeador com 2 nocautes teve exatamente 10 derrotas a mais que o que venceu 15 nocautes.
3. O boxeador com maior numero de derrotas venceu menos lutas que aquele com 15 nocautes.
4. Bruno possui exatamente a metade dos nocautes que o boexador com cinco derrotas.
5. Joao teve exatamente o dobro das derrotas do boexador com maior número de derrotas.
6. Joao teve exatamente 5 nocautes a mais que o número de vitórias conquistadas pelo boxeador que possui exatamente o dobro de nocautes de Alfredo.
7. Ivan teve o mesmo número de derrotas que Bruno teve de nocautes.
8. O boxeador com 15 vitórias tem exatamente três vezes o número de derrotas que o lutador com 25 vitórias.

boxers([marcelo, alfredo, joao, bruno, ivan]).
vitorias([5, 10, 15, 20, 25]).
derrotas(X) :- vitorias(X).
nocautes([2, 4, 5, 10, 15]).

boxer_stats(P) :-
vitorias(Vitorias),
derrotas(Derrotas),
nocautes(Nocautes),
permutation(Vitorias, V),
permutation(Derrotas, D),
permutation(Nocautes, N),
P = [V, D, N].

boxer_solution([], [], [[],[],[]]).
boxer_solution(Boxer_list, Boxer_names, Boxer_stats) :-
Boxer_list = [boxe(Nome, Vitoria, Derrota, Nocaute) | B],
Boxer_names = [Nome | N],
Boxer_stats = [[Vitoria | V], [Derrota | D], [Nocaute | K]],
boxer_solution(B, N, [V, D, K]).

list_solution(S) :-
boxer_stats(Stats),
boxers(Names),
boxer_solution(S, Names, Stats).

solve(X) :-
list_solution(X),
member(boxe(marcelo, _, _, 4), X),
member(boxe(_, _, B, 2), X),
member(boxe(_, 15, A, _), X),
B is 10 + A,
member(boxe(_, C, 25, _), X),
member(boxe(_, D, _, 15), X),
C < D,
member(boxe(bruno, _, _, E), X),
member(boxe(_, _, 5, F), X),
F is 2 * E,
member(boxe(joao, _, G, _), X),
member(boxe(_, 25, H, _), X),
G is 2 * H,
member(boxe(joao, _, _, I), X),
member(boxe(_, J, _, K), X),
member(boxe(alfredo, _, _, L), X),
I is J + 5,
K is 2 * L,
member(boxe(ivan, _, M, _), X),
member(boxe(bruno, _, _, M), X),
member(boxe(_, 15, N, _), X),
member(boxe(_, 25, O, _), X),
N is 3 * O.

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 :)