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

quarta-feira, 9 de março de 2011

Massa e matéria

Eu achava que F=ma era a definição de força, mas agora eu acho que é a definição de massa. Massa você define como sendo resistência à aceleração.

O problema é que tem experimentos (anteriores ao Einstein) que mostram que é mais difícil empurrar um corpo eletricamente carregado que um eletricamente neutro. Também é mais difícil empurrar uma mola apertada que uma mola vazia, e mais difícil empurrar uma pilha carregada que uma pilha vazia. Ou seja, a quantidade de energia acumulada também impede a aceleração. Então massa não é matéria, é matéria mais energia.

Como corolário, qual energia tem uma bolinha em movimento? Energia cinética, que varia com a velocidade. Então quanto mais velocidade, mais energia, e portanto mais resistência à aceleração. Mas resistência à aceleração é massa, logo, quanto mais velocidade, mais massa. Ou seja, partindo de massa = energia+matéria você deduz em três linhas a relatividade especial.

Agora, se massa é resistência, o que é matéria? Matéria é uma coisa que você pode contar. Dois m&ms deveriam ter duas vezes mais matéria que um m&m. Se você quebrar o m&m em moléculas, átomos e daí pra baixo, percebe que matéria é feita de bárions. Em um sistema fechado, o número de bárions não muda, então a lei da conservação da matéria é a lei da conservação da quantidade de bárions (você pode violar isso usando anti-matéria mas eu nem vou complicar agora).

Daí, conservação da matéria e conservação da massa são duas conservações diferentes. Matéria é quantidade de partículas, isso é constante e invariante. Massa é resistencia à aceleração, isso também é constante, mas depende do observador (já que massa muda com a velocidade, e a velocidade muda com o observador).

Até aqui eu acho que entendi. O que eu não entendi ainda é:
1. Conservação de momento linear e conservação de massa são a mesma coisa?
2. Eu entendo que você cria massa a partir de energia, mas como se cria matéria a partir de energia?
3. Eu sei que força é um artifício matemático, você pode fazer uma mecânica tipo a hamiltoniana sem o conceito de força. Dá pra fazer uma mecânica sem matéria também? (Assumindo que momento é um primitivo ou algo assim?)

Enfim eu não entendo nada de física :P