El problema lógico que elegí en clase es el siguiente:
Missing Fish
Two fathers took their sons fishing.
Each man and son caught one fish, but when they returned to camp there were only 3 fish. How could this be?
(None of the fish were eaten, lost, or thrown back.)
Dos padres con sus hijos fueron de pesca.
Cada hombre y su hijo atraparon un pez, pero cuando regresaron al campamento solo había tres pescados ¿Cómo puede ser esto?
(Ninguno de los peces se comieron, murió o escapó).
Bueno este problema es más que lógico capcioso ya que en un principio se presta a pensar que tenemos 2 padres y 2 hijos lo que da un total de 4 personas y si cada una atrapo un pez, pues lo lógico es que hayan 4 peces, sin embargo solo hay tres.
Entonces hay que pensar el problema con más detenimiento desde el principio textualmente el poblema dice: "Dos padres con sus hijos fueron de pesca.", lo cual no quiere decir forzosamente que son 4 personas, porque?... porque nos dice que hay dos padres y dos hijos sin embargo no especifica si hay o no parentescos entre ellos, por eso podemos hacer la suposición de que es posible que haya por ahi un truco en el que un hijo pueda ser papá a la vez, y así tener 2 hijos y 2 papás, pero solo son tres personas.
Ahora podemos llegar a la solución del problema diciendo que si dos hijos y dos padres se fueron de pesca y sólo hay tres pescados no hay porque alarmarse ya que cada quíen tiene su propio pescado :D, tenemos el PAPÁ el HIJO(que también es papá) y el otro hijo.
En términos de programación no me fué tan fácil expresarlo primero que nada hice un árbol con parentesco de padres con hijos:
padre_de(pedro,jose).
padre_de(pedro,luis).
padre_de(jose,daniel).
padre_de(jose,hector).
padre_de(luis,carlos).
padre_de(luis,simon).
padre_de(luis,edgar).
padre_de(edgar,lalo).
y aquí ahora debo de encontrar todas las combinaciones posibles en las que podemos involucrar padre_de(A,B), padre_de(C,D) dónde A es diferente de C y D es diferente de B y obtener así las combinaciones(X,Y,Z) dónde esta combinación me dará como resultado tres personas en las que se va a cumplir el razonamiento que expuse anteriormente, sin dar la pista clave del problema.
Pero no se aún como plantearlo en Prolog :/, antes de esto mi código era el siguiente:
padre_de(pedro,jose).
padre_de(pedro,luis).
padre_de(jose,daniel).
padre_de(jose,hector).
padre_de(luis,carlos).
padre_de(luis,simon).
padre_de(luis,edgar).
padre_de(edgar,lalo).
combinacion(X,Y,Z):-padre_de(X,Y),padre_de(Y,Z).
..pero aquí no dejo que prolog razone el problema y ecuentre el truco aunque me da todas las combinaciones de tres personas.
Bueno espero me comenten y si hayan alguna solución a mi código me lo digan :D, ya estuve viendo en los blogs y nadie tiene algo parecido :S, encontré en el grupo de la Doctora Sara un blog en el que resolvían el problema pero creo que esta mal la forma en que lo plantearon en prolog.
¿Te diste por vencida? :S Yo hubiera intentado algo tipo (advertencia: estoy improvisando notación y NO he probado esto en prolog en realidad): "fueron_a_pescar(X, Y, X) := padre_de(A, B), padre_de(C, D), uno_de(A, X, Y, Z), uno_de_(B, X, Y, Z), uno_de(C, X, Y, Z), uno_de_(D, X, Y, Z), A=/=C, B=/=D." donde "uno_de(H, I, J, K) := H=:=I; H=:=J; H=:=K." donde pretendo que eso signifique que H tiene que ser igual a o I o J o K... Si lo logras, te pongo los dos puntos por el programa lógico. Por ahora te pongo dos puntos por el reporte en sí.
ResponderEliminarque podría producir un resultado tipo "fueron_a_pescar(luis, edgar, lalo)? yes" para cualquier triple hijo-padre-abuelo.