UTNianos

Versión completa: Ayuda tp logico
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
buenas a todos, estoy totalmente bloqueado con el tp de paradigmas, seguro es una boludes, pero hace horas que le doy vueltas y no le encuentro la solucion.

yo tengo en mi base

esta(posicion(1,4),saiyajin(goku,8)).
esta(posicion(3,1),terricola(roque)).
esta(posicion(3,2),terricola(bulma)).
esta(posicion(3,2),monstruo(piccolo,34)).
esta(posicion(2,4),saiyajin(gohan,3)).
esta(posicion(4,3),monstruo(cell,17)).

aliado(goku,gohan).
aliado(goku,bulma).
aliado(roque,goku).
aliado(piccolo,cell).

necesito hacer "sonAliados(saiyajin(goku,8), terricola(bulma))." y que me de true

lo que hice hasta ahora fue unificar guerrero.

guerrero(Guerrero) :- guerrero(Guerrero) :- esta(_,Guerrero).

pero el problema es que aliado solo acepta el nombre que esta en el functor pero sonAliados necesita el functor

sonAliados(Guerrero1,Guerrero2) :- guerrero(Guerrero1), guerrero(Guerrero2), aliados(,). ahi en aliados nose como armarlo.

Si alguno me puede dar una mano agradecidisimo.

Saludos
Hola!

Lo que podes hacer es algo asi: en sonAliados/2 recibis los functores, pero el predicado aliado relaciona los nombres. Lo que tenes que buscar es que consigas el nombre de la persona independientemente del planeta de origen. Podes pensarlo haciendo estos predicados:

nombre(sayajin(Nombre,_),Nombre).
nombre(terricola(Nombre),Nombre).
nombre(monstruo(Nombre,_),Nombre).

Ese es el viejo y querido polimorfismo, relaciona a una persona independientemente de su origen con su nombre. Despues podes plantear el problema que te piden resolver:

sonAliados(Aliado1, Aliado2):- guerrero(Aliado1), guerrero(Aliado2), nombre(Aliado1,Nombre1), nombre(Aliado2,Nombre2), aliado(Nombre1, Nombre2).

Simplemente se generan a los functores, se obtienen los nombres y luego corrobora que sean aliados entre si con el predicado que ya tenes. No es necesario que pienses la reciprocidad en aliado/2, ya que en algun momento los va a generar de la forma en la que esta en la base de conocimientos.

Espero que te sirva!

Saludos!
Hola, primero deberias definir predicados para tratar a terricola,monstruo y saiyajin de la misma forma y despues es como lo estabas haciendo, asi:

guerrero(Guerrero) :- esta(_,saiyajin(Guerrero,_)).
guerrero(Guerrero) :- esta(_,terricola(Guerrero)).
guerrero(Guerrero) :- esta(_,monstruo(Guerrero,_)).

sonAliados(Guerrero1,Guerrero2) :- guerrero(Guerrero1), guerrero(Guerrero2), aliado(Guerrero1,Guerrero2), Guerrero1 \= Guerrero2.
---

ah, la consulta con el functor seria como dijeron arriba, mi consulta es solo por el nombre
me fume el apunto del ceit que andaba digitalizado por ahi, y entendi lo que querias decir con eso y funciono joya!!

Mil gracias!!!!

Saludos
Consulta sobre el mismo TP.

el punto 6 dice "TodosExceptoUno/1: dado un conjunto de guerreros determinar si todos están felices
excepto uno. No es inversible."

Mi consulta es como hacer para trabajar con un conjunto de guerreros. Entiendo que la consulta es de esta forma:

todosExceptoUno([Guerrero,Guerrero2,Guerrero3]). Donde Guerrero puede ser alguno de los funtores.

Para trabajar con varios valores tengo que crear una estructura de lista estilo [cab|Cola] ?, o hay una forma de que tome los valores de la lista uno por uno. A partir de este punto a varios similares por lo que estoy algo trabado con esto. Cualquier ayuda se agradece.
Si vos sabes que todos tienen que estar felices excepto uno, no te basta con generar una lista con todos los guerreros tristes y validar si su longitud es 1? (si es uno quiere decir que todos están felices excepto ese).
Para ello podrías hacer un findall.
Esa solución no la toman como valida porque dicen que es estructurada y no declarativa.

La termine haciendo de la siguiente manera.

todosExceptoUno(Guerreros):- member(Guerrero,Guerreros), not(guerreroFeliz(Guerrero)),
forall((guerreroFeliz(Otroguerrero),Guerrero \= Otroguerrero),member(Guerrero,Guerreros)).

Lo que hace es buscar en la lista de guerreros un guerrero que no sea feliz, y después buscar que todos los guerreros sean felices siempre y cuando no sean el que no era feliz.
(02-05-2015 20:50)Andres_utn escribió: [ -> ]buenas a todos, estoy totalmente bloqueado con el tp de paradigmas, seguro es una boludes, pero hace horas que le doy vueltas y no le encuentro la solucion.

yo tengo en mi base

esta(posicion(1,4),saiyajin(goku,8)).
esta(posicion(3,1),terricola(roque)).
esta(posicion(3,2),terricola(bulma)).
esta(posicion(3,2),monstruo(piccolo,34)).
esta(posicion(2,4),saiyajin(gohan,3)).
esta(posicion(4,3),monstruo(cell,17)).

aliado(goku,gohan).
aliado(goku,bulma).
aliado(roque,goku).
aliado(piccolo,cell).

necesito hacer "sonAliados(saiyajin(goku,8), terricola(bulma))." y que me de true

lo que hice hasta ahora fue unificar guerrero.

guerrero(Guerrero) :- guerrero(Guerrero) :- esta(_,Guerrero).

pero el problema es que aliado solo acepta el nombre que esta en el functor pero sonAliados necesita el functor

sonAliados(Guerrero1,Guerrero2) :- guerrero(Guerrero1), guerrero(Guerrero2), aliados(,). ahi en aliados nose como armarlo.

Si alguno me puede dar una mano agradecidisimo.

Saludos

El punto 7 como solucionaste la parte del aliado, porque cuando queria unir las esferas me sale "false" si 1 de los 2 no tiene esferas. Pero si los 2 tienen esferas me anda bien.

unir([ ],L2,L2).
unir(L1,[ ],L1).
unir([X|R],L2,[X|Z]):-unir(R,L2,Z).

puedeConseguirAux(Guerrero,Esferas):-guerrero(Guerrero),forall(esta(Posicion,Guerrero),esta(Posicion,esfera(Esfera))),
findall(Esfera,(esta(Posicion,Guerrero),esta(Posicion,esfera(Esfera))),Esferas).

puedeConseguir2(Guerrero1,Esferas):-guerrero(Guerrero1),guerrero(Guerrero2),sonAliados(Guerrero1,Guerrero2),puedeConseguirAux(Guerrero1,Esferas1),puedeConseguirAux(Guerrero2,Esferas2),
unir(Esferas1,Esferas2,Esferas).
(21-05-2015 12:14)alvar escribió: [ -> ]
(02-05-2015 20:50)Andres_utn escribió: [ -> ]buenas a todos, estoy totalmente bloqueado con el tp de paradigmas, seguro es una boludes, pero hace horas que le doy vueltas y no le encuentro la solucion.

yo tengo en mi base

esta(posicion(1,4),saiyajin(goku,8)).
esta(posicion(3,1),terricola(roque)).
esta(posicion(3,2),terricola(bulma)).
esta(posicion(3,2),monstruo(piccolo,34)).
esta(posicion(2,4),saiyajin(gohan,3)).
esta(posicion(4,3),monstruo(cell,17)).

aliado(goku,gohan).
aliado(goku,bulma).
aliado(roque,goku).
aliado(piccolo,cell).

necesito hacer "sonAliados(saiyajin(goku,8), terricola(bulma))." y que me de true

lo que hice hasta ahora fue unificar guerrero.

guerrero(Guerrero) :- guerrero(Guerrero) :- esta(_,Guerrero).

pero el problema es que aliado solo acepta el nombre que esta en el functor pero sonAliados necesita el functor

sonAliados(Guerrero1,Guerrero2) :- guerrero(Guerrero1), guerrero(Guerrero2), aliados(,). ahi en aliados nose como armarlo.

Si alguno me puede dar una mano agradecidisimo.

Saludos

El punto 7 como solucionaste la parte del aliado, porque cuando queria unir las esferas me sale "false" si 1 de los 2 no tiene esferas. Pero si los 2 tienen esferas me anda bien.

unir([ ],L2,L2).
unir(L1,[ ],L1).
unir([X|R],L2,[X|Z]):-unir(R,L2,Z).

puedeConseguirAux(Guerrero,Esferas):-guerrero(Guerrero),forall(esta(Posicion,Guerrero),esta(Posicion,esfera(Esfera))),
findall(Esfera,(esta(Posicion,Guerrero),esta(Posicion,esfera(Esfera))),Esferas).

puedeConseguir2(Guerrero1,Esferas):-guerrero(Guerrero1),guerrero(Guerrero2),sonAliados(Guerrero1,Guerrero2),puedeConseguirAux(Guerrero1,Esferas1),puedeConseguirAux(Guerrero2,Esferas2),
unir(Esferas1,Esferas2,Esferas).

El 7 yo lo hice asi :

consigue(Guerrero,Esfera):- esta(Posicion,Guerrero),esta(Posicion,esfera(Esfera)),Guerrero\=esfera(_).
consigue(Guerrero,Esfera):- esta(Posicion,Guerrero2),esta(Posicion,esfera(Esfera)),sonAliados(Guerrero2,Guerrero).

puedeConseguir(Guerrero,Esferas):- guerrero(Guerrero),
findall(Esfera,consigue(Guerrero,Esfera),Lista),
sinRepetidos(Lista,Esferas).

sinRepetidos([],[]).
sinRepetidos([Cab|Cola],Lista):-member(Cab,Cola),sinRepetidos(Cola,Lista).
sinRepetidos([Cab|Cola],[Cab|Cola1]):-sinRepetidos(Cola,Cola1).

Genere una lista que reciba todo junto (las esferas que consigue un guerrero y las que consigue su aliado). Después un sinRepetidos/2 para quitar los elementos repetidos. Anteriormente había hecho 2 listas (la lista 1 para las esferas del guerrero y la lista 2 para las esferas del aliado), después las concatenaba con unirSinRepeticion/3, pero me lo bocharon aclarándome que estaba usando una lista de mas.
Si algún alma caritativa encuentra errores bienvenido sea!
Y buen, espero que esto sea de ayuda. Saludoss
Tengo dudas con el punto 8 y no se como plantear el 9.

8)
guerrero(G):-esta(_,G),G\=esfera(_).

recorrer1(Pos,Nombre):-guerrero(Guerrero),findall(Posicion,(puedeMoverse(Guerrero,Terreno),tipoDeTerreno(Posicion,Terreno)),Pos),nombre(Guerrero,Nombre).

recorrer2(Pos,Nombre):-guerrero(Guerrero),findall(Posicion,esta(Posicion,Guerrero),Pos),nombre(Guerrero,Nombre).

puedeRecorrer(Pos,Nombre):-guerrero(Guerrero),nombre(Guerrero,Nombre),recorrer1(Pos1,Nombre),recorrer2(Pos2,Nombre),append(Pos1,Pos2,Pos).

al consultar

puedeRecorrer(Pos,Nombre).

me sale todos las posiciones de cada guerrero, pero al consultar alguna posicion en concreto para el guerrero, siempre me sale false.

Agradeceria su ayuda
Agradecería una mano
El punto 1 pide que sea Simetrico, osea que si A es aliado de B entonces B es aliado de A.
Como hiciste para que pase eso?
en el punto 7 no te aceptan el sin repetidos, yo hice lo mismo, arme la lista y despues use una funcion para borrar los repetidos de la lista y no le gusto, como casi los 9 puntos del tp en todos tenia algo que acotar o decir.

el punto 8 lo hice asi y me dijo que estaba bien.

puedenRecorrer(Posiciones,Nombre) :- guerrero(Guerrero,Nombre), not(((member(Posicion,Posiciones), tipoDeTerreno(Posicion,Terreno)),not(puedeMoverse(Guerrero,Terreno)))).


alguien hizo el guerreroestafeliz/1 lo hice pero me da que nadie es feliz??
URLs de referencia