Acciones

Diferencia entre revisiones de «Relación 2»

De Lógica matemática y fundamentos (2012-13)

m
Línea 4: Línea 4:
 
-- José A. Alonso Jiménez <jalonso@us,es>
 
-- José A. Alonso Jiménez <jalonso@us,es>
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
module SintaxisSemantica where
 
module SintaxisSemantica where
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Librerías auxiliares                                              --
 
-- Librerías auxiliares                                              --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
import Data.List  
 
import Data.List  
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Gramática de fórmulas prosicionales                                --
 
-- Gramática de fórmulas prosicionales                                --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 1: Definir los siguientes tipos de datos:
 
-- Ejercicio 1: Definir los siguientes tipos de datos:
Línea 25: Línea 25:
 
--  respectivamente.   
 
--  respectivamente.   
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
type SímboloProposicional = String
 
type SímboloProposicional = String
 
+
 
data Prop = Atom SímboloProposicional
 
data Prop = Atom SímboloProposicional
 
           | Neg Prop  
 
           | Neg Prop  
Línea 35: Línea 35:
 
           | Equi Prop Prop  
 
           | Equi Prop Prop  
 
           deriving (Eq,Ord)
 
           deriving (Eq,Ord)
 
+
 
instance Show Prop where
 
instance Show Prop where
 
     show (Atom p)  = p
 
     show (Atom p)  = p
Línea 43: Línea 43:
 
     show (Impl p q) = "(" ++ show p ++ " --> " ++ show q ++ ")"
 
     show (Impl p q) = "(" ++ show p ++ " --> " ++ show q ++ ")"
 
     show (Equi p q) = "(" ++ show p ++ " <--> " ++ show q ++ ")"
 
     show (Equi p q) = "(" ++ show p ++ " <--> " ++ show q ++ ")"
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 2: Definir las siguientes fórmulas proposicionales
 
-- Ejercicio 2: Definir las siguientes fórmulas proposicionales
 
-- atómicas: p, p1, p2, q, r, s, t y u.
 
-- atómicas: p, p1, p2, q, r, s, t y u.
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
p, p1, p2, q, r, s, t, u :: Prop
 
p, p1, p2, q, r, s, t, u :: Prop
 
p  = Atom "p"
 
p  = Atom "p"
Línea 58: Línea 58:
 
t  = Atom "t"
 
t  = Atom "t"
 
u  = Atom "u"
 
u  = Atom "u"
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 3: Definir la función
 
-- Ejercicio 3: Definir la función
Línea 64: Línea 64:
 
-- tal que (no f) es la negación de f.
 
-- tal que (no f) es la negación de f.
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
no :: Prop -> Prop
 
no :: Prop -> Prop
 
no = Neg
 
no = Neg
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 4: Definir los siguientes operadores
 
-- Ejercicio 4: Definir los siguientes operadores
Línea 77: Línea 77:
 
--    f <--> g    es la equivalencia entre f y g
 
--    f <--> g    es la equivalencia entre f y g
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
infixr 5 \/
 
infixr 5 \/
 
infixr 4 /\
 
infixr 4 /\
Línea 87: Línea 87:
 
(-->)  = Impl
 
(-->)  = Impl
 
(<-->) = Equi
 
(<-->) = Equi
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Símbolos proposicionales de una fórmula                            --
 
-- Símbolos proposicionales de una fórmula                            --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 5: Definir la función
 
-- Ejercicio 5: Definir la función
Línea 99: Línea 99:
 
--    símbolosPropFórm (p /\ q --> p)  ==> [p,q]
 
--    símbolosPropFórm (p /\ q --> p)  ==> [p,q]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Antonio Molero
 
-- Antonio Molero
 
+
 
simbolosPropForm :: Prop -> [Prop]
 
simbolosPropForm :: Prop -> [Prop]
 
simbolosPropForm (Atom p)  = [(Atom p)]
 
simbolosPropForm (Atom p)  = [(Atom p)]
Línea 109: Línea 109:
 
simbolosPropForm (Impl p q) = simbolosPropForm p `union` simbolosPropForm q
 
simbolosPropForm (Impl p q) = simbolosPropForm p `union` simbolosPropForm q
 
simbolosPropForm (Equi p q) = simbolosPropForm p `union` simbolosPropForm q
 
simbolosPropForm (Equi p q) = simbolosPropForm p `union` simbolosPropForm q
 
+
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Interpretaciones                                                  --
 
-- Interpretaciones                                                  --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 6: Definir el tipo de datos Interpretación para
 
-- Ejercicio 6: Definir el tipo de datos Interpretación para
 
-- representar las interpretaciones como listas de fórmulas atómicas.
 
-- representar las interpretaciones como listas de fórmulas atómicas.
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
type Interpretación = [Prop]
+
type Interpretacion = [Prop]
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Significado de una fórmula en una interpretación                  --
 
-- Significado de una fórmula en una interpretación                  --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 7: Definir la función
 
-- Ejercicio 7: Definir la función
Línea 144: Línea 144:
 
significado (Equi p q) a = (significado (Impl p q) a )==(significado (Impl q p)) a  
 
significado (Equi p q) a = (significado (Impl p q) a )==(significado (Impl q p)) a  
 
   
 
   
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Interpretaciones de una fórmula                                    --
 
-- Interpretaciones de una fórmula                                    --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 8: Definir la función
 
-- Ejercicio 8: Definir la función
Línea 156: Línea 156:
 
--    subconjuntos "abc"  ==>  ["abc","ab","ac","a","bc","b","c",""]
 
--    subconjuntos "abc"  ==>  ["abc","ab","ac","a","bc","b","c",""]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Reme Sillero
 
-- Reme Sillero
 
+
 
subconjuntos :: [a] -> [[a]]
 
subconjuntos :: [a] -> [[a]]
 
subconjuntos []    = [[]]
 
subconjuntos []    = [[]]
 
subconjuntos (x:xs) = [x:ys | ys <- subconjuntos xs] ++ subconjuntos xs
 
subconjuntos (x:xs) = [x:ys | ys <- subconjuntos xs] ++ subconjuntos xs
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 9: Definir la función
 
-- Ejercicio 9: Definir la función
Línea 170: Línea 170:
 
--    interpretacionesFórm (p /\ q --> p)  ==>  [[p,q],[p],[q],[]]
 
--    interpretacionesFórm (p /\ q --> p)  ==>  [[p,q],[p],[q],[]]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Reme Sillero
 
-- Reme Sillero
 
+
interpretacionesForm :: Prop -> [Interpretación]
+
interpretacionesForm :: Prop -> [Interpretacion]
 
interpretacionesForm p = subconjuntos (simbolosPropForm p)
 
interpretacionesForm p = subconjuntos (simbolosPropForm p)
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Modelos de fórmulas                                                --
 
-- Modelos de fórmulas                                                --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 10: Definir la función
 
-- Ejercicio 10: Definir la función
Línea 191: Línea 191:
 
esModeloFormula :: Interpretacion ->Prop -> Bool
 
esModeloFormula :: Interpretacion ->Prop -> Bool
 
esModeloFormula = \f-> \i -> (significado i f)
 
esModeloFormula = \f-> \i -> (significado i f)
 
+
 
-- Miriam Núñez-Romero.
 
-- Miriam Núñez-Romero.
esModeloFormula2 :: Interpretación -> Prop -> Bool
+
esModeloFormula2 :: Interpretacion -> Prop -> Bool
 
esModeloFormula2 i f | (significado f i) ==True =True
 
esModeloFormula2 i f | (significado f i) ==True =True
 
                     |otherwise=False
 
                     |otherwise=False
Línea 205: Línea 205:
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
--Pedro G. Ros
 
--Pedro G. Ros
modelosFórmula :: Prop -> [Interpretación]
+
modelosFormula :: Prop -> [Interpretacion]
modelosFórmula f = [x|x<-(interpretacionesForm f),esModeloFormula2 x f]
+
modelosFormula f = [x|x<-(interpretacionesForm f),esModeloFormula2 x f]
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Fórmulas válidas, satisfacibles e insatisfacibles                  --
 
-- Fórmulas válidas, satisfacibles e insatisfacibles                  --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 12: Definir la función
 
-- Ejercicio 12: Definir la función
Línea 220: Línea 220:
 
--    esVálida ((p --> q) \/ (q --> p))  ==>  True
 
--    esVálida ((p --> q) \/ (q --> p))  ==>  True
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Reme Sillero
 
-- Reme Sillero
 
+
esVálida :: Prop -> Bool
+
esValida :: Prop -> Bool
esVálida f = modelosFormula f == interpretacionesForm f
+
esValida f = modelosFormula f == interpretacionesForm f
 
+
 
+
 
--Pedro G. Ros
 
--Pedro G. Ros
 
--Ser válida es ser tautología, luego la definición anterior no es correcta, sería:
 
--Ser válida es ser tautología, luego la definición anterior no es correcta, sería:
esVálida f = elem [] (modelosFormula f)
+
esValida2 f = elem [] (modelosFormula f)
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 13: Definir la función
 
-- Ejercicio 13: Definir la función
Línea 238: Línea 238:
 
--    esInsatisfacible ((p --> q) /\ (q --> r))  ==>  False
 
--    esInsatisfacible ((p --> q) /\ (q --> r))  ==>  False
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Reme Sillero
 
-- Reme Sillero
 
+
 
esInsatisfacible :: Prop -> Bool
 
esInsatisfacible :: Prop -> Bool
 
esInsatisfacible f =  modelosFormula f == []
 
esInsatisfacible f =  modelosFormula f == []
 
+
 
--Pedro G. Ros
 
--Pedro G. Ros
 
esInsatisfacible2 :: Prop-> Bool
 
esInsatisfacible2 :: Prop-> Bool
esInsatisfacible2 f = esVálida (no f)
+
esInsatisfacible2 f = esValida (no f)
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 14: Definir la función
 
-- Ejercicio 14: Definir la función
Línea 256: Línea 256:
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Reme Sillero
 
-- Reme Sillero
 
+
 
esSatisfacible :: Prop -> Bool
 
esSatisfacible :: Prop -> Bool
 
esSatisfacible f = modelosFormula f /= []
 
esSatisfacible f = modelosFormula f /= []
 
+
 
-- Isabel Duarte
 
-- Isabel Duarte
 
esSatisfacible2 :: Prop -> Bool
 
esSatisfacible2 :: Prop -> Bool
 
esSatisfacible2 f = not (esInsatisfacible f)
 
esSatisfacible2 f = not (esInsatisfacible f)
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Símbolos proposicionales de un conjunto de fórmulas                --
 
-- Símbolos proposicionales de un conjunto de fórmulas                --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 15: Definir la función
 
-- Ejercicio 15: Definir la función
Línea 277: Línea 277:
 
--    uniónGeneral [[1],[1,2],[2,3]]  ==>  [1,2,3]
 
--    uniónGeneral [[1],[1,2],[2,3]]  ==>  [1,2,3]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Antonio Molero
 
-- Antonio Molero
 
+
 
unionGeneral :: Eq a => [[a]] -> [a]
 
unionGeneral :: Eq a => [[a]] -> [a]
 
unionGeneral []    = []
 
unionGeneral []    = []
 
unionGeneral (x:xs) = x `union` unionGeneral xs  
 
unionGeneral (x:xs) = x `union` unionGeneral xs  
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 16: Definir la función
 
-- Ejercicio 16: Definir la función
Línea 291: Línea 291:
 
--    símbolosPropConj [p /\ q --> r, p --> s]  ==>  [p,q,r,s]
 
--    símbolosPropConj [p /\ q --> r, p --> s]  ==>  [p,q,r,s]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Antonio Molero
 
-- Antonio Molero
 
+
 
simbolosPropConj :: [Prop] -> [Prop]
 
simbolosPropConj :: [Prop] -> [Prop]
 
simbolosPropConj s = unionGeneral [simbolosPropForm x|x<-s]
 
simbolosPropConj s = unionGeneral [simbolosPropForm x|x<-s]
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Interpretaciones de un conjunto de fórmulas                        --
 
-- Interpretaciones de un conjunto de fórmulas                        --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 17: Definir la función
 
-- Ejercicio 17: Definir la función
Línea 309: Línea 309:
 
--    ==> [[p,q,r],[p,q],[p,r],[p],[q,r],[q],[r],[]]
 
--    ==> [[p,q,r],[p,q],[p,r],[p],[q,r],[q],[r],[]]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- Reme Sillero
 
-- Reme Sillero
 
+
interpretacionesConjunto :: [Prop] -> [Interpretación]
+
interpretacionesConjunto :: [Prop] -> [Interpretacion]
 
interpretacionesConjunto s = subconjuntos (simbolosPropConj s)
 
interpretacionesConjunto s = subconjuntos (simbolosPropConj s)
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Modelos de conjuntos de fórmulas                                  --
 
-- Modelos de conjuntos de fórmulas                                  --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 18: Definir la función
 
-- Ejercicio 18: Definir la función
Línea 329: Línea 329:
 
--    ==> False
 
--    ==> False
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
--Isabel Duarte
 
--Isabel Duarte
esModeloConjunto :: Interpretación -> [Prop] -> Bool
+
esModeloConjunto :: Interpretacion -> [Prop] -> Bool
esModeloConjunto i s = and [ esModeloFórmula i x | x <- s]  
+
esModeloConjunto i s = and [ esModeloFormula i x | x <- s]  
 
+
 
--Pedro G. Ros
 
--Pedro G. Ros
 
esModeloConjunto2 :: Interpretacion-> [Prop] -> Bool
 
esModeloConjunto2 :: Interpretacion-> [Prop] -> Bool
 
esModeloConjunto2 i [] = True
 
esModeloConjunto2 i [] = True
 
esModeloConjunto2 i (x:xs) = (esModeloFormula2 i x)&&(esModeloConjunto2 i xs)
 
esModeloConjunto2 i (x:xs) = (esModeloFormula2 i x)&&(esModeloConjunto2 i xs)
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 19: Definir la función
 
-- Ejercicio 19: Definir la función
Línea 349: Línea 349:
 
--    ==> [[p,q,r],[p],[q,r]]
 
--    ==> [[p,q,r],[p],[q,r]]
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
--Isabel Duarte
 
--Isabel Duarte
modelosConjunto :: [Prop] -> [Interpretación]
+
modelosConjunto :: [Prop] -> [Interpretacion]
 
modelosConjunto s = [ x | x <- (interpretacionesConjunto s), esModeloConjunto x s]
 
modelosConjunto s = [ x | x <- (interpretacionesConjunto s), esModeloConjunto x s]
 
+
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Conjuntos consistentes e inconsistentes de fórmulas                --
 
-- Conjuntos consistentes e inconsistentes de fórmulas                --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 20: Definir la función
 
-- Ejercicio 20: Definir la función
Línea 369: Línea 369:
 
--    ==> False
 
--    ==> False
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
--Jesús Horno Cobo
 
--Jesús Horno Cobo
 
esConsistente :: [Prop] -> Bool
 
esConsistente :: [Prop] -> Bool
 
esConsistente s = modelosConjunto s /= []
 
esConsistente s = modelosConjunto s /= []
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 21: Definir la función
 
-- Ejercicio 21: Definir la función
Línea 384: Línea 384:
 
--    ==> True
 
--    ==> True
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
--Jesús Horno Cobo
 
--Jesús Horno Cobo
 
esInconsistente :: [Prop] -> Bool
 
esInconsistente :: [Prop] -> Bool
 
esInconsistente s = modelosConjunto s == []
 
esInconsistente s = modelosConjunto s == []
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Consecuencia lógica                                                --
 
-- Consecuencia lógica                                                --
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 22: Definir la función
 
-- Ejercicio 22: Definir la función
Línea 401: Línea 401:
 
--    esConsecuencia [p] (p /\ q)                  ==>  False
 
--    esConsecuencia [p] (p /\ q)                  ==>  False
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
+
 
--Jesús Horno Cobo
 
--Jesús Horno Cobo
 
esConsecuencia :: [Prop] -> Prop -> Bool
 
esConsecuencia :: [Prop] -> Prop -> Bool
 
esConsecuencia s f = esInconsistente ((no f):s)
 
esConsecuencia s f = esInconsistente ((no f):s)
 
</source>
 
</source>

Revisión del 13:06 24 abr 2013

-- SintaxisSemanticaProp.hs
-- Lógica proposicional: Sintaxis y semántica
-- José A. Alonso Jiménez <jalonso@us,es>
-- ---------------------------------------------------------------------
 
module SintaxisSemantica where
 
-- ---------------------------------------------------------------------
-- Librerías auxiliares                                               --
-- ---------------------------------------------------------------------
 
import Data.List 
 
-- ---------------------------------------------------------------------
-- Gramática de fórmulas prosicionales                                --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 1: Definir los siguientes tipos de datos:
-- * SímboloProposicional para representar los símbolos de proposiciones
-- * Prop para representar las fórmulas proposicionales usando los
--   constructores Atom, Neg, Conj, Disj, Impl y Equi para las fórmulas
--   atómicas, negaciones, conjunciones, implicaciones y equivalencias,
--   respectivamente.  
-- ---------------------------------------------------------------------
 
type SímboloProposicional = String
 
data Prop = Atom SímboloProposicional
          | Neg Prop 
          | Conj Prop Prop 
          | Disj Prop Prop 
          | Impl Prop Prop 
          | Equi Prop Prop 
          deriving (Eq,Ord)
 
instance Show Prop where
    show (Atom p)   = p
    show (Neg p)    = "no " ++ show p
    show (Conj p q) = "(" ++ show p ++ " /\\ " ++ show q ++ ")"
    show (Disj p q) = "(" ++ show p ++ " \\/ " ++ show q ++ ")"
    show (Impl p q) = "(" ++ show p ++ " --> " ++ show q ++ ")"
    show (Equi p q) = "(" ++ show p ++ " <--> " ++ show q ++ ")"
 
-- ---------------------------------------------------------------------
-- Ejercicio 2: Definir las siguientes fórmulas proposicionales
-- atómicas: p, p1, p2, q, r, s, t y u.
-- ---------------------------------------------------------------------
 
p, p1, p2, q, r, s, t, u :: Prop
p  = Atom "p"
p1 = Atom "p1"
p2 = Atom "p2"
q  = Atom "q"
r  = Atom "r"
s  = Atom "s"
t  = Atom "t"
u  = Atom "u"
 
-- ---------------------------------------------------------------------
-- Ejercicio 3: Definir la función
--    no :: Prop -> Prop
-- tal que (no f) es la negación de f.
-- ---------------------------------------------------------------------
 
no :: Prop -> Prop
no = Neg
 
-- ---------------------------------------------------------------------
-- Ejercicio 4: Definir los siguientes operadores
--    (/\), (\/), (-->), (<-->) :: Prop -> Prop -> Prop
-- tales que
--    f /\ g      es la conjunción de f y g
--    f \/ g      es la disyunción de f y g
--    f --> g     es la implicación de f a g
--    f <--> g    es la equivalencia entre f y g
-- ---------------------------------------------------------------------
 
infixr 5 \/
infixr 4 /\
infixr 3 -->
infixr 2 <-->
(/\), (\/), (-->), (<-->) :: Prop -> Prop -> Prop
(/\)   = Conj
(\/)   = Disj
(-->)  = Impl
(<-->) = Equi
 
-- ---------------------------------------------------------------------
-- Símbolos proposicionales de una fórmula                            --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 5: Definir la función
--    símbolosPropFórm :: Prop -> [Prop]
-- tal que (símbolosPropFórm f) es el conjunto formado por todos los
-- símbolos proposicionales que aparecen en f. Por ejemplo,
--    símbolosPropFórm (p /\ q --> p)  ==> [p,q]
-- ---------------------------------------------------------------------
 
-- Antonio Molero
 
simbolosPropForm :: Prop -> [Prop]
simbolosPropForm (Atom p)   = [(Atom p)]
simbolosPropForm (Neg p)    = simbolosPropForm p
simbolosPropForm (Conj p q) = simbolosPropForm p `union` simbolosPropForm q
simbolosPropForm (Disj p q) = simbolosPropForm p `union` simbolosPropForm q
simbolosPropForm (Impl p q) = simbolosPropForm p `union` simbolosPropForm q
simbolosPropForm (Equi p q) = simbolosPropForm p `union` simbolosPropForm q
 
 
-- ---------------------------------------------------------------------
-- Interpretaciones                                                   --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 6: Definir el tipo de datos Interpretación para
-- representar las interpretaciones como listas de fórmulas atómicas.
-- ---------------------------------------------------------------------
 
type Interpretacion = [Prop]
 
-- ---------------------------------------------------------------------
-- Significado de una fórmula en una interpretación                   --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 7: Definir la función
--    significado :: Prop -> Interpretación -> Bool
-- tal que (significado f i) es el significado de f en i. Por ejemplo,
--    significado ((p \/ q) /\ ((no q) \/ r)) [r]    ==>  False
--    significado ((p \/ q) /\ ((no q) \/ r)) [p,r]  ==>  True
-- ---------------------------------------------------------------------
-- Pedro G. Ros
significado :: Prop -> Interpretacion -> Bool
significado (Neg(Atom p)) a = elem (no (Atom p)) a
significado (Atom p) a = elem (Atom p) a
significado (Neg p) a = not (significado p a)
significado (Conj p q) a= (significado p a)&& (significado q a)
significado (Disj p q) a =(significado p a)|| (significado q a)
significado (Impl p q) a = if (significado p a) then (significado q a)==
                           True else True
significado (Equi p q) a = (significado (Impl p q) a )==(significado (Impl q p)) a 
 
 
-- ---------------------------------------------------------------------
-- Interpretaciones de una fórmula                                    --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 8: Definir la función
--    subconjuntos :: [a] -> [[a]]
-- tal que (subconjuntos x) es la lista de los subconjuntos de x. Por
-- ejmplo, 
--    subconjuntos "abc"  ==>  ["abc","ab","ac","a","bc","b","c",""]
-- ---------------------------------------------------------------------
 
-- Reme Sillero
 
subconjuntos :: [a] -> [[a]]
subconjuntos []     = [[]]
subconjuntos (x:xs) = [x:ys | ys <- subconjuntos xs] ++ subconjuntos xs
 
-- ---------------------------------------------------------------------
-- Ejercicio 9: Definir la función
--    interpretacionesFórm :: Prop -> [Interpretación]
-- tal que (interpretacionesFórm f) es la lista de todas las
-- interpretaciones de f. Por ejemplo, 
--    interpretacionesFórm (p /\ q --> p)  ==>  [[p,q],[p],[q],[]]
-- ---------------------------------------------------------------------
 
-- Reme Sillero
 
interpretacionesForm :: Prop -> [Interpretacion]
interpretacionesForm p = subconjuntos (simbolosPropForm p)
 
-- ---------------------------------------------------------------------
-- Modelos de fórmulas                                                --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 10: Definir la función
--    esModeloFórmula :: Interpretación -> Prop -> Bool
-- tal que (esModeloFórmula i f) se verifica si i es un modelo de f. Por
-- ejemplo, 
--    esModeloFórmula [r]   ((p \/ q) /\ ((no q) \/ r))    ==>  False
--    esModeloFórmula [p,r] ((p \/ q) /\ ((no q) \/ r))    ==>  True
-- ---------------------------------------------------------------------
--Pedro G. Ros
esModeloFormula :: Interpretacion ->Prop -> Bool
esModeloFormula = \f-> \i -> (significado i f)
 
-- Miriam Núñez-Romero.
esModeloFormula2 :: Interpretacion -> Prop -> Bool
esModeloFormula2 i f | (significado f i) ==True =True
                     |otherwise=False
-- ---------------------------------------------------------------------
-- Ejercicio 11: Definir la función
--    modelosFórmula :: Prop -> [Interpretación]
-- tal que (modelosFórmula f) es la lista de todas las interpretaciones
-- de f que son modelo de F. Por ejemplo,
--    modelosFórmula ((p \/ q) /\ ((no q) \/ r)) 
--    ==> [[p,q,r],[p,r],[p],[q,r]]
-- ---------------------------------------------------------------------
--Pedro G. Ros
modelosFormula :: Prop -> [Interpretacion]
modelosFormula f = [x|x<-(interpretacionesForm f),esModeloFormula2 x f]
 
-- ---------------------------------------------------------------------
-- Fórmulas válidas, satisfacibles e insatisfacibles                  --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 12: Definir la función
--    esVálida :: Prop -> Bool
-- tal que (esVálida f) se verifica si f es válida. Por ejemplo,
--    esVálida (p --> p)                 ==>  True
--    esVálida (p --> q)                 ==>  False
--    esVálida ((p --> q) \/ (q --> p))  ==>  True
-- ---------------------------------------------------------------------
 
-- Reme Sillero
 
esValida :: Prop -> Bool
esValida f = modelosFormula f == interpretacionesForm f
 
 
--Pedro G. Ros
--Ser válida es ser tautología, luego la definición anterior no es correcta, sería:
esValida2 f = elem [] (modelosFormula f)
-- ---------------------------------------------------------------------
-- Ejercicio 13: Definir la función
--    esInsatisfacible :: Prop -> Bool
-- tal que (esInsatisfacible f) se verifica si f es insatisfacible. Por
-- ejemplo, 
--    esInsatisfacible (p /\ (no p))             ==>  True
--    esInsatisfacible ((p --> q) /\ (q --> r))  ==>  False
-- ---------------------------------------------------------------------
 
-- Reme Sillero
 
esInsatisfacible :: Prop -> Bool
esInsatisfacible f =  modelosFormula f == []
 
--Pedro G. Ros
esInsatisfacible2 :: Prop-> Bool
esInsatisfacible2 f = esValida (no f)
-- ---------------------------------------------------------------------
-- Ejercicio 14: Definir la función
--    esSatisfacible :: Prop -> Bool
-- tal que (esSatisfacible f) se verifica si f es satisfacible. Por
-- ejemplo, 
--    esSatisfacible (p /\ (no p))             ==>  False
--    esSatisfacible ((p --> q) /\ (q --> r))  ==>  True
-- ---------------------------------------------------------------------
-- Reme Sillero
 
esSatisfacible :: Prop -> Bool
esSatisfacible f = modelosFormula f /= []
 
-- Isabel Duarte
esSatisfacible2 :: Prop -> Bool
esSatisfacible2 f = not (esInsatisfacible f)
 
-- ---------------------------------------------------------------------
-- Símbolos proposicionales de un conjunto de fórmulas                --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 15: Definir la función
--    uniónGeneral :: Eq a => [[a]] -> [a]
-- tal que (uniónGeneral x) es la unión de los conjuntos de la lista de
-- conjuntos x. Por ejemplo,
--    uniónGeneral []                 ==>  []
--    uniónGeneral [[1]]              ==>  [1]
--    uniónGeneral [[1],[1,2],[2,3]]  ==>  [1,2,3]
-- ---------------------------------------------------------------------
 
-- Antonio Molero
 
unionGeneral :: Eq a => [[a]] -> [a]
unionGeneral []     = []
unionGeneral (x:xs) = x `union` unionGeneral xs 
 
-- ---------------------------------------------------------------------
-- Ejercicio 16: Definir la función
--    símbolosPropConj :: [Prop] -> [Prop]
-- tal que (símbolosPropConj s) es el conjunto de los símbolos
-- proposiciones de s. Por ejemplo,
--    símbolosPropConj [p /\ q --> r, p --> s]  ==>  [p,q,r,s]
-- ---------------------------------------------------------------------
 
-- Antonio Molero
 
simbolosPropConj :: [Prop] -> [Prop]
simbolosPropConj s = unionGeneral [simbolosPropForm x|x<-s]
 
-- ---------------------------------------------------------------------
-- Interpretaciones de un conjunto de fórmulas                        --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 17: Definir la función
--    interpretacionesConjunto :: [Prop] -> [Interpretación]
-- tal que (interpretacionesConjunto s) es la lista de las
-- interpretaciones de s. Por ejemplo,
--    interpretacionesConjunto [p --> q, q --> r]
--    ==> [[p,q,r],[p,q],[p,r],[p],[q,r],[q],[r],[]]
-- ---------------------------------------------------------------------
 
-- Reme Sillero
 
interpretacionesConjunto :: [Prop] -> [Interpretacion]
interpretacionesConjunto s = subconjuntos (simbolosPropConj s)
 
-- ---------------------------------------------------------------------
-- Modelos de conjuntos de fórmulas                                   --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 18: Definir la función
--    esModeloConjunto :: Interpretación -> [Prop] -> Bool
-- tal que (esModeloConjunto i s) se verifica si i es modelo de s. Por
-- ejemplo, 
--    esModeloConjunto [p,r] [(p \/ q) /\ ((no q) \/ r), q --> r]
--    ==> True
--    esModeloConjunto [p,r] [(p \/ q) /\ ((no q) \/ r), r --> q]
--    ==> False
-- ---------------------------------------------------------------------
 
--Isabel Duarte
esModeloConjunto :: Interpretacion -> [Prop] -> Bool
esModeloConjunto i s = and [ esModeloFormula i x | x <- s] 
 
--Pedro G. Ros
esModeloConjunto2 :: Interpretacion-> [Prop] -> Bool
esModeloConjunto2 i [] = True
esModeloConjunto2 i (x:xs) = (esModeloFormula2 i x)&&(esModeloConjunto2 i xs)
 
-- ---------------------------------------------------------------------
-- Ejercicio 19: Definir la función
--    modelosConjunto :: [Prop] -> [Interpretación]
-- tal que (modelosConjunto s) es la lista de modelos del conjunto
-- s. Por ejemplo,
--    modelosConjunto [(p \/ q) /\ ((no q) \/ r), q --> r]
--    ==> [[p,q,r],[p,r],[p],[q,r]]
--    modelosConjunto [(p \/ q) /\ ((no q) \/ r), r --> q]
--    ==> [[p,q,r],[p],[q,r]]
-- ---------------------------------------------------------------------
 
--Isabel Duarte
modelosConjunto :: [Prop] -> [Interpretacion]
modelosConjunto s = [ x | x <- (interpretacionesConjunto s), esModeloConjunto x s]
 
 
-- ---------------------------------------------------------------------
-- Conjuntos consistentes e inconsistentes de fórmulas                --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 20: Definir la función
--    esConsistente :: [Prop] -> Bool
-- tal que (esConsistente s) se verifica si s es consistente. Por
-- ejemplo, 
--    esConsistente [(p \/ q) /\ ((no q) \/ r), p --> r]        
--    ==> True
--    esConsistente [(p \/ q) /\ ((no q) \/ r), p --> r, no r]  
--    ==> False
-- ---------------------------------------------------------------------
 
--Jesús Horno Cobo
esConsistente :: [Prop] -> Bool
esConsistente s = modelosConjunto s /= []
 
-- ---------------------------------------------------------------------
-- Ejercicio 21: Definir la función
--    esInconsistente :: [Prop] -> Bool
-- tal que (esInconsistente s) se verifica si s es inconsistente. Por
-- ejemplo, 
--    esInconsistente [(p \/ q) /\ ((no q) \/ r), p --> r]        
--    ==> False
--    esInconsistente [(p \/ q) /\ ((no q) \/ r), p --> r, no r]  
--    ==> True
-- ---------------------------------------------------------------------
 
--Jesús Horno Cobo
esInconsistente :: [Prop] -> Bool
esInconsistente s = modelosConjunto s == []
 
-- ---------------------------------------------------------------------
-- Consecuencia lógica                                                --
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
-- Ejercicio 22: Definir la función
--    esConsecuencia :: [Prop] -> Prop -> Bool
-- tal que (esConsecuencia s f) se verifica si f es consecuencia de
-- s. Por ejemplo,
--    esConsecuencia [p --> q, q --> r] (p --> r)  ==>  True
--    esConsecuencia [p] (p /\ q)                  ==>  False
-- ---------------------------------------------------------------------
 
--Jesús Horno Cobo
esConsecuencia :: [Prop] -> Prop -> Bool
esConsecuencia s f = esInconsistente ((no f):s)