Prolog - Equivalencia a Flatten en Prolog

 
Vista:

Equivalencia a Flatten en Prolog

Publicado por msi_ (4 intervenciones) el 21/01/2005 22:18:19
Hola de nuevo. Sigo haciendo ejercicios de prolog y está vez estoy con Aplanar(+Xs,?Ys) donde Ys es una lista con todos los elementos de Xs.
Ejemplo: aplanar([a,b,[c,[d],e],[f,g],h ], X).
X = [a,b,c,d,e,f,g,h]

He visto que existe un predicado llamado flatten que hace esto exactamente pero no puedo utilizarlo. Mi codigo no funciona bien pero estoy casi seguro que va por buen camino. ¿Me ayudais a corregirlo?.

aplanar([],[]).

aplanar([X|Resto],[X|Ys]):- atomic(X),aplanar(Resto,Ys).

/*Si es un elemento lo añade sin mas y sigue con el resto*/

aplanar([X|Resto],Ys):- is_list(X), aplanar(X,Ys), aplanar(Resto,Ys).

/*Aqui es donde tengo el problema. Si es una lista hago que la cabecera (X), que es una lista vuelva arriba para ir cogiendo cada elemento de ella. Una vez que hecho esto, debo seguir con el resto de la entrada.*/

He seguido trazas pero no me funciona bien. El problema lo tengo a la hora de aplanar(Resto,Ys). Por ejemplo, si fuese:

aplanar([a,b,[c,d],f], X).

La respuesta es NO. Si quito ese ultimo aplanar quedando:
aplanar([X|Resto],Ys):- is_list(X), aplanar(X,Ys) la salida seria X=[a,b,c,d]

Se que me falta aplanar el resto pero esto me hace suponer que voy por buen camino pero no se me ocurre la solucion (he intentado ir concatenando pero tampoco hallo solución).

¿Alguna ayuda? Un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Equivalencia a Flatten en Prolog

Publicado por msi_ (4 intervenciones) el 23/01/2005 23:30:42
Ya encontré la solución. A veces es mejor dejar pasar un tiempo para volver con fuerzas renovadas.

Un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Equivalencia a Flatten en Prolog

Publicado por yasim (1 intervención) el 23/03/2007 21:50:15
mira este es el codigo correcto para este ejercico

aplanar(Xs,Ys):-aplanar(Xs,[],Ys).

aplanar([X|Xs],As,Ys):-aplanar(Xs,As,As1), aplanar(X,As1,Ys).
aplanar(X,As,[X|As]):-integer(X).
aplanar(X,As,[X|As]):-atom(X), X\=[].
aplanar([],Ys,Ys).

si tienes alguna duda escribeme
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar