segunda-feira, 25 de abril de 2011

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

6 comentários:

  1. Prolog é uma linguagem fantástica.
    Alguns problemas chatos de se resolver em algumas linguagens são resolvidos com poucas linhas no Prolog, e tudo de forma bem coerente e lógica.

    ResponderExcluir
  2. Olá, Ric!

    Brinquei com Prolog na graduação mas nunca aprofundei. Na verdade, esqueci tanta coisa sobre a linguagem que tenho de lhe perguntar: que interpretador está usando?

    Até!

    ResponderExcluir
  3. Prolog é muito legal... Faz um tempo que esotu procuranod uma desculpa pra usar um tal compilador de Prolog que tem por aí! :)

    ResponderExcluir
  4. Só uma dúvida, e se caso uma das dicas fosse " The german doesnt drink milk" ( o alemão não bebe leite), como seria a linha de código correspondente neste caso ? No caso de a casa não é branca, você usou o /+C, mas e se for outra variável como na minha dúvida aqui ? Por favor, quem souber responda. Um abraço.

    ResponderExcluir
  5. Suponho que seja \+member(house(_, milk, german), K), ou seja, "K não possui um membro que seja alemão e bebe leite".

    ResponderExcluir