lunes, 8 de noviembre de 2010

Lenguajes Lógicos Reporte

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.

1 comentario:

  1. ¿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í.


    que podría producir un resultado tipo "fueron_a_pescar(luis, edgar, lalo)? yes" para cualquier triple hijo-padre-abuelo.

    ResponderEliminar