UTNianos

Versión completa: Ayuda con TP de Paradigmas
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola, me mandaron un Tp que tiene como punto el siguiente:
aliado(goku,gohan).
aliado(goku,bulma).
aliado(roque,goku).
aliado(piccolo,cell).

Se pide implementar estos predicados totalmente inversibles salvo indicación de lo contrario:
1. sonAliados/2: Verifica si dos guerreros son aliados.
?- sonAliados(saiyajin(goku,8),terricola(bulma)).
true.

El problema es que me pide que sea simetrico, osea que si Roque e aliado de Goku entonces Goku es aliado de Roque.
Yo pense en arreglarlo asi:
aliado(X,Y):-aliado(Y,X).
pero me crea un bucle interminable.

Como podria hacerlo?

sonAliados(Sujeto1,Sujeto2):-aliado(Nombre1,Nombre2), nombre(Nombre1,Sujeto1), nombre(Nombre2,Sujeto2).
nombre1(Nombre,saiayin(Nombre,_)).
nombre1(Nombre,terricola(Nombre)).
nombre1(Nombre,monstruo(Nombre,_)).
nombre(Nombre,Sujeto):-esGuerrero(Sujeto),nombre1(Nombre,Sujeto).
para cuando es el tp?
Exe, pensalo en términos lógicos:
A y B son aliados si se cumple que A es aliado de B, o bien que B es aliado de A.

En español es medio un sinsentido, porque "ser aliado" es bidireccional (si yo soy aliado de alguien, ese alguien es aliado mío), pero acá no.

Y, ¿cómo hacés en lógico/prolog una regla que tiene dos formas posibles de ser verdadera?

Arrobeame si contestás, por si tardo en leerlo.
lograste solucionarlo??
Tengo el mismo problema en ese punto.
alvar, se te ocurre alguna respuesta para eso que le preguntaba a Exe?
(04-06-2015 01:56)Desert69 escribió: [ -> ]alvar, se te ocurre alguna respuesta para eso que le preguntaba a Exe?

hice lo que hizo exe en su momento. Pero no se me ocurre algo con eso.
alvar, si el punto fuera únicamente decir que dos personajes son aliados si al menos uno de los dos es un terricola, ¿sabrías escribir una regla para eso?
No se si ya respondieron esto. Una posible solución es la siguiente:

sonAliados(Guerrero,Otroguerrero):- nombredelguerrero(Guerrero,Nombre1),
nombredelguerrero(Otroguerrero,Nombre2),
aliados(Nombre1,Nombre2).

aliados(Nombre1,Nombre2):- aliado(Nombre1,Nombre2).
aliados(Nombre1,Nombre2):- aliado(Nombre2,Nombre1).

obtenes los nombres de los 2 guerreros y te fijas si son aliados, esto pasa si A aliado con B, o al revez.

saludos
URLs de referencia