-
Notifications
You must be signed in to change notification settings - Fork 0
/
Oraculo.hs
88 lines (62 loc) · 2.25 KB
/
Oraculo.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
-- Alumnos: Grupo 14
-- Miguel Fagundez / 09-10264
-- Hector Dominguez / 09-10241
-- ** Declaracion del modulo **
module Oraculo
(
Oraculo(..),
crearPrediccion,
crearPregunta,
obtenerCadena,
obtenerEstadisticas
) where
import Data.Maybe
-- ** Declaracion tipo de datos **
data Oraculo = Prediccion {prediccion :: String}
| Pregunta {pregunta :: String
,positivo :: Oraculo
,negativo :: Oraculo}
deriving (Show,Read)
-- ** FIN Declaracion tipo de datos **
-- ** Funciones de construccion **
crearPrediccion :: String -> Oraculo
crearPrediccion s = Prediccion s
crearPregunta :: String -> Oraculo -> Oraculo -> Oraculo
crearPregunta s o1 o2 = Pregunta s o1 o2
-- ** FIN Funciones de construccion **
-- ** Funciones de acceso **
-- Definidas automaticamente por Haskell por la forma de declaracion del tipo
-- ** FIN Funciones de acceso **
-- ** Funciones de Consulta **
obtenerCadena :: Oraculo -> String -> Maybe [(String, Bool)]
obtenerCadena (Prediccion s1) s = if s == s1 then Just [] else Nothing
obtenerCadena oraculo str = if list == [] then Nothing else Just list
where
list = reverse (buscar oraculo str [])
obtenerEstadisticas :: Oraculo -> (Int,Int,Float)
obtenerEstadisticas o = (minimo, maximo, promedio)
where
todoscaminos = caminos o
minimo = minimum todoscaminos
maximo = maximum todoscaminos
promedio = fromIntegral (sum (todoscaminos) ) / fromIntegral (length (todoscaminos ) )
-- ** FIN Funciones de Consulta **
-- ** Funciones auxiliares **
-- Auxiliares para obtenerCadena
buscar :: Oraculo -> String ->[(String,Bool)]->[(String, Bool)]
buscar (Pregunta s1 o1 o2) str l = if (esta o1 str || esta o2 str) then
if esta o1 str then (buscar o1 str ((s1, True):l) )
else (buscar o2 str ((s1, False):l))
else []
buscar (Prediccion _) _ l = l
esta :: Oraculo -> String -> Bool
esta (Prediccion s1) s = (s1 == s)
esta (Pregunta s1 o1 o2) s = esta o1 s || esta o2 s
-- FIN auxiliares para obtenerCadena
-- Auxiliares para obtenerEstadisticas
caminos :: Oraculo -> [ Int ]
caminos (Prediccion s) = [ 0 ]
caminos (Pregunta s o1 o2) = map (1+) (caminos o1) ++ map (1+) (caminos o2)
-- FIN auxiliares para obtenerEstadisticas
-- ** FIN Funciones auxiliares **
-- ** FIN Declaracion del modulo **