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.
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


0