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.

Nenhum comentário:

Postar um comentário