Éste es un viejo acertijo lógico, atribuido a Einstein:
- El inglés vive en la casa roja.
- El sueco tiene perro.
- El danés toma té.
- El noruego vive en la primera casa.
- El Alemán fuma Prince.
- La casa verde queda inmediatamente a la izquierda de la blanca.
- El dueño de la casa verde toma café.
- La persona que fuma Pall Mall cría pájaros.
- El dueño de la casa amarilla fuma Dunhill.
- El hombre que vive en la casa del centro toma leche.
- El hombre que fuma Blends vive al lado del que tiene un gato.
- El hombre que tiene un caballo vive al lado del que fuma Dunhill.
- El hombre que fuma Bluemaster toma cerveza.
- El hombre que fuma Blends es vecino del que toma agua.
- El noruego vive al lado de la casa azul.
Ante estas afirmaciones, la pregunta es: ¿de quién es el pez?
Veamos una manera de resolverlo utilizando Prolog:
insertar(E, L, [E|L]).
insertar(E, [X|Y], [X|Z]):-insertar(E, Y, Z).
permutacion([], []).
permutacion([X|Y], Z):-permutacion(Y, L), insertar(X, L, Z).
posicion(X, [X|L], 1).
posicion(Y, [X|L], Z):-posicion(Y, L, R), Z is R+1.
izquierda(X1, X2, L):-posicion(X1, L, P1), posicion(X2, L, P2), P2 is P1+1.
vecinos(P1, P2):-P1 is P2+1;P2 is P1+1.
escribir(A, B, C, D, E):-writeln(A), writeln(B), writeln(C), writeln(D), writeln(E).
de-quien-es-el-pez(L1, L2, L3, L4, L5):-
permutacion([ingles, sueco, danes, noruego, aleman], L1),
permutacion([roja, blanca, verde, amarilla, azul], L2),
/_ 1. El inglés vive en la casa roja. _/
posicion(ingles, L1, P1), posicion(roja, L2, P1),
permutacion([perro, pajaros, gato, caballo, pez], L3),
/_ 2. El sueco tiene perro. _/
posicion(sueco, L1, P2), posicion(perro, L3, P2),
permutacion([te, cafe, leche, cerveza, agua], L4),
/_ 3. El danés toma té. _/
posicion(danes, L1, P3), posicion(te, L4, P3),
/_ 4. El noruego vive en la primera casa. _/
posicion(noruego, L1, P4), P4 is 1,
permutacion([prince, pallmall, dunhill, blends, bluemaster], L5),
/_ 5. El Alemán fuma Prince. _/
posicion(aleman, L1, P5), posicion(prince, L5, P5),
/_ 6. La casa verde queda inmediatamente a la izquierda de la blanca. _/
izquierda(verde, blanca, L2),
/_ 7. El dueño de la casa verde toma café. _/
posicion(verde, L2, P6), posicion(cafe, L4, P6),
/_ 8. La persona que fuma Pall Mall cría pájaros. _/
posicion(pallmall, L5, P7), posicion(pajaros, L3, P7),
/_ 9. El dueño de la casa amarilla fuma Dunhill. _/
posicion(amarilla, L2, P8), posicion(dunhill, L5, P8),
/_ 10. El hombre que vive en la casa del centro toma leche. _/
posicion(leche, L4, P9), P9 is 3,
/_ 11. El hombre que fuma Blends vive al lado del que tiene un gato. _/
posicion(blends, L5, P10), posicion(gato, L3, P11), vecinos(P10, P11),
/_ 12. El hombre que tiene un caballo vive al lado del que fuma Dunhill. _/
posicion(caballo, L3, P12), vecinos(P8, P12),
/_ 13. El hombre que fuma Bluemaster toma cerveza. _/
posicion(bluemaster, L5, P13), posicion(cerveza, L4, P13),
/_ 14. El hombre que fuma Blends es vecino del que toma agua. _/
posicion(agua, L4, P14), vecinos(P10, P14),
/_ 15. El noruego vive al lado de la casa azul. _/
posicion(azul, L2, P15), vecinos(P1, P15).
main:-
de-quien-es-el-pez(L1, L2, L3, L4, L5),
escribir(L1, L2, L3, L4, L5).
main.
Y la solución:
[noruego,danes,ingles,aleman,sueco]
[amarilla,azul,roja,verde,blanca]
[gato,caballo,pajaros,pez,perro]
[agua,te,leche,cafe,cerveza]
[dunhill,blends,pallmall,prince,bluemaster]