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