Carlos Sivira, 15-11377
Daniel Figueroa, 16-10371
Junior Lara, 17-10303
Astrid Alvarado, 18-10938
Para clonar el repositorio, ejecute la siguiente línea de código
$ git clone https://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@github.com/JMLTUnderCode/Proyecto_1_LLP1_Haskinator.gitPara esto, ejecute la siguiente línea de código:
$ cabal install splitPara este proyecto se utilizaron las siguientes versiones
GHC 9.2.7GHC 9.2.8GHC 9.4.7GHC 9.6.3
Por lo tanto, a partir de la versión 9.2.7 de GHC este proyecto puede ser ejecutado.
$ mkdir -p build
$ ghc -odir build -hidir build -o build/haskinator haskinator.hs
$ ./build/haskinatorO en un solo comando:
$ mkdir -p build && ghc -odir build -hidir build -o build/haskinator haskinator.hs && ./build/haskinator-
-
Este tipo de datos se define como:
data Oraculo = Prediccion String | Pregunta String Opciones
DondePrediccionalmacena una cadena de caracteres con la predicción correspondiente, en cambio,Preguntasirve para almacenar la pregunta a realizar por Haskinator y las diferentes opciones disponibles para responder a dicha pregunta.-
-
Para la instancia de
Show, se empleó la función auxiliarshowData :: Oraculo -> Int -> String, el cual genera una cadena de caracteres a partir de un Oraculo dado y la profundidad actual del árbol. Por ejemplo, al realizarSe obtiene la siguiente cadena:show $ Pregunta "a?" (Map.fromList [("b", Pregunta "c?" (Map.fromList [("d", Prediccion "e")])), ("f", Pregunta "g?" (Map.fromList [("h", Prediccion "i")]))])
Esto se logra al recorrer el árbol generado de Oraculo, donde la tabulación representa el nivel de profundidad alcanzado.a? - b: c? - d: e - f: g? - h: i -
Para la instancia de
Read, se empleó la función auxiliarreadData :: [String] -> Int -> Oraculo, la cual a partir de una lista de cadenas de caracteres y la profundidad recorrida en el árbol, retorna un Oraculo con los datos suministrados de la cadena de caracteres. Por ejemplo, al realizar:Se obtiene el siguiente resultadoread "a?\n\t- b: c?\n\t\t- d: e\n\t- f: g?\n\t\t- h: i" :: Oraculo
Esto se logra a través de la cantidad de tabulaciones, donde la tabulación representa el nivel de profundidad alcanzado y por ende su ubicación correspondiente.Pregunta "a?" (Map.fromList [("b", Pregunta "c?" (Map.fromList [("d", Prediccion "e")])), ("f", Pregunta "g?" (Map.fromList [("h", Prediccion "i")]))])
-
Para poder realizar comparaciones en el tipo
Oraculo, se realizó una derivación de la instaciaEq
-
Para la instancia de
-
-
Este tipo de datos se define como:
type Opciones = Map.Map String Oraculo
Esto es, un diccionario cuyas claves son del tipoString, las cuales representa las diferentes opciones a contestar. Los valores asociados a las claves son del tipoOraculo, por lo tanto para una opción seleccionada se tiene que puede llevar a una prediccion o una nueva pregunta.
-
Este tipo de datos se define como:
-
crearOraculo :: String -> Oraculo
Función que dado una cadena de caracteres, genera un Oraculo de tipoPrediccionramificar :: [String] -> [Oraculo] -> String -> Oraculo
Función implementada mediante el uso de las funcioneszipymap, permitiendo construir los elementos que conforman un Oráculo de tipoPreguntacon la lista de cadenas de caracteres (opciones) dados con la lista de Oráculos (bien seaPreguntaoPrediccion).
-
prediccion :: Oraculo -> String
Dado unOraculo, retorna la cadena de caracteres asociada al tipoPrediccion, en caso de recibir el tipoPregunta, se arroja un errorpregunta :: Oraculo -> String
Dado unOraculo, retorna la cadena de caracteres asociada al tipoPregunta, en caso de recibir el tipoPrediccion, se arroja un erroropciones :: Oraculo -> Opciones
Dado unOraculo, retorna las opciones asociadas al tipoPregunta, en caso de recibir el tipoPrediccion, se arroja un errorrespuesta :: Oraculo -> String -> Oraculo
Función implementada mediante el uso de la instruccióncasepara la extracción del Oraculo, donde si se encuentraJust op, se retornaopy en cambio, si se encuentraNothingse reporta error, permitiendo realizar la extracción de las opciones vinculadas a una pregunta. En caso de recibir unaPrediccion, se arroja error
-
obtenerCadena :: Oraculo -> String -> Maybe [(String, String)]
Función que permite obtener la cadena de preguntas y respuestas que llevan a una prediccion. Esta función es implementada con dos funciones auxiliaresobtenerPredicciones :: Oraculo -> [String]
Función que permite obtener las predicciones de unOraculocomo una lista de cadena de caracteres. Esto facilita la búsqueda de una predicción en elOraculo.camino :: Oraculo -> String -> [(String, String)]
Función que dado unOraculoy una prediccion (como una cadena de caracteres), devuelve la cadena de preguntas y respuestas que llevan a dicha prediccion
obtenerEstadisticas :: Oraculo -> (Float, Float, Float)
Función que permite obtener las estadisticas de unOraculoen forma de la tripleta(mínimo, máximo, promedio)profundidades :: Oraculo -> [Int]
Función que dado unOraculo, devuelve una lista con las profundidades de todas las predicciones.obtenerProfundidad :: Oraculo -> String -> Int
Función que dado unOraculoy una predicción (como una cadena de caracteres), devuelve la profundidad de dicha predicción
El módulo Haskinator mantiene la interacción con el usuario y Oraculo. La función main emplea dos funciones auxiliares header, que muestra en pantalla el título del programa y los integrantes de este proyecto; y cliente, el cual se compone de:
-
Para esta funcionalidad se utilizó la función
crearOraculodel móduloOraculo. Esta opción es activada al ingresar el número1 -
Para esta funcionalidad se utilizó la función
predecir :: Oraculo -> Oraculo -> String -> IO Oraculo
Funcion que recorre el Oraculo para realizar la predicción, del mismo modo, se encarga de la actualización del mismo en caso de que no exista la opción o la predicción no sea acertada. Para esto se utilizan las siguientes funciones auxiliaresactualizarOraculo :: (String, Oraculo) -> Oraculo -> Oraculo -> Oraculo
Función para actualizar el Oraculo dado cuando la predicción no sea la acertada. En esta, una vez se encuentra la predicción a modificar, se agrega la nueva ramificación con las preguntas suministradas al usuario.actualizarOraculo' :: (String, Oraculo) -> String -> Oraculo -> OraculoFunción para actualizar el Oraculo dado cuando la opción pensada por el usuario no se encuentra en las disponibles. En esta, una vez se encuentra la pregunta a modificar, se agrega la nueva opción con la predicción suministrada por el usuario.esPregunta :: Oraculo -> BoolFunción que indica si un Oraculo es de tipoPregunta
Esta opción es activada al ingresar el número
2 -
persistirOraculo :: Oraculo -> String -> IO ()
Función que, dado un Oraculo y el nombre del archivo, genera un archivo.txtcon el oraculo actual. Para esta función, se hizo uso de la instanciaShowcreada y la herramienta correspondiente para la escritura de archivos, por lo tanto el formato del archivo generado es el siguiente:a? - b: c? - d: e - f: g? - h: i
Para hacer uso de esta opción, se debe ingresar el número
3 -
cargarOraculo :: String -> OraculoFunción que, dado el nombre del archivo.txt, genera un oraculo con la información del archivo. Para esta función, se hizo uso de la instanciaReadcreada y la herramienta correspondiente para la lectura de archivos, por lo tanto el formato del archivo a ingresar es el siguiente:Es de suma importancia asegurarse de que el archivo esté bien identado, con un espacio justo después de guion (-) y los dos puntos (:) de cada opción.a? - b: c? - d: e - f: g? - h: i
Para esta función se utilizó las siguientes funciones auxiliareshasRepeatPredictions :: Oraculo -> Bool
Función que dado un Oraculo determina si hay o no predicciones repetidas. Esta función hace uso dehasDuplicates :: Eq a => [a] -> Bool
Función genérica que determina si hay elementos repetidos en una lista de elementos comparables. Para esto utiliza la funciónnubque elimina elementos repetidos de una lista y verifica que la lista sea de distinto tamaño a la original.
Para hacer uso de esta opción, se debe ingresar el número
4 -
preguntaCrucial :: Oraculo -> String -> String -> Maybe (String, String, String)
Función que dado un Oraculo y dos strings retorna el LCA (Lowest Common Ancestor) en el arbol informacion descrito por Oraculo. Esta función hace uso decaminoComun :: [(String, String)] -> [(String, String)] -> [(String, String)]
Funcion que dadas dos cadenas (listas de preguntas hasta una predicción), devuelve el segmento común entre ellas partiendo desde el inicio de ambas listas.
Para usar esta opción, se debe ingresar el número
5 -
Para esta funcionalidad se utilizó la función
obtenerEstadisticasdel móduloOraculo. Si se quiere hacer uso de la misma, se debe ingresar el número6 -
Fin del programa. Para activar esta función, se debe ingresar el número
7
El copyright atacó nuestro proyecto, por lo tanto para evitar problemas legales le traemos una versión pirata alterna: El Currao Haskinator. Para más información de la historia, puede leer el archivo pdf del mismo nombre.