¡Esta es una revisión vieja del documento!
Resolviendo problemas complejos
Empecemos con nuestro ejercicio estrella: recomendar amigos en una red social. En el día anterior especificamos el problema a alto nivel, es decir, distinguimos sus diferentes partes pero no entramos en detalle sobre cómo se podrían implementar cada una de estas partes. Repasemos qué era lo que tenía que hacer el programa:
- obtener la lista de todos los amigos de los amigos de la persona a quien queremos recomendar nuevos amigos (llamémosle
p
). Para eso necesitaremos la funciónlosAmigosDeMisAmigos :: [Int] → [(Int,String,[Int])] → [Int]
, que se puede armar usando la función auxiliarlistaDeAmigos :: Int → [(Int,String,[Int])] → [Int]
. - descartar de esa lista todos los que ya son amigos de
p
, es decir, que ya están en la lista de amigos dep
. Para eso necesitaremos la funciónfiltrarNoEstanEnLista :: [Int] → [Int] → [Int]
. - descartar de esa lista a
p
. - quedarnos solamente con los amigos que son amigos por lo menos de dos amigos de
p
, es decir, descartar los que son amigos solamente de uno de los amigos dep
. Para eso necesitaremos el predicadoexiste2
, que se aplicará mediante un filtro.
La función principal recomendarNuevosAmigos
se puede definir ahora como una combinación de todas estas funciones auxiliares, por ejemplo, de la siguiente manera:
recomendarNuevosAmigos (id,n,misamigos) directorio = filter existe2 ( filter (noEs id) ( filtrarNoEstanEnLista misamigos ( losAmigosDeMisAmigos misamigos directorio ) ) )
Ahora lo que tenemos que hacer es desarrollar cada una de las partes que hemos especificado, por separado.
Y cómo sería este mismo problema en prolog? Vamos a tratar de aplicar la misma aproximación: primero vemos el problema a alto nivel, nos damos cuenta de cuáles son las diferentes partes del problema y cómo están relacionadas entre ellas, y después pasamos a desarrollar cada una de estas partes independientemente.