Diferencia entre revisiones de «Relación 2»
De Lógica matemática y fundamentos (2012-13)
(No se muestran 24 ediciones intermedias de 6 usuarios) | |||
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 | + | 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 133: | Línea 133: | ||
-- significado ((p \/ q) /\ ((no q) \/ r)) [p,r] ==> True | -- significado ((p \/ q) /\ ((no q) \/ r)) [p,r] ==> True | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | -- Pedro G. Ros | |
− | significado :: Prop -> | + | significado :: Prop -> Interpretacion -> Bool |
− | significado = | + | 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 (Neg(Neg p)) a = 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 | (significado p a) = (significado q a) | ||
+ | | otherwise = True | ||
+ | significado (Equi p q) a = (significado p a)==(significado q 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 148: | Línea 157: | ||
-- 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 162: | Línea 171: | ||
-- interpretacionesFórm (p /\ q --> p) ==> [[p,q],[p],[q],[]] | -- interpretacionesFórm (p /\ q --> p) ==> [[p,q],[p],[q],[]] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
-- Reme Sillero | -- Reme Sillero | ||
− | + | ||
− | interpretacionesForm :: Prop -> [ | + | 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 180: | Línea 189: | ||
-- esModeloFórmula [p,r] ((p \/ q) /\ ((no q) \/ r)) ==> True | -- 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 | -- Ejercicio 11: Definir la función | ||
Línea 192: | Línea 205: | ||
-- ==> [[p,q,r],[p,r],[p],[q,r]] | -- ==> [[p,q,r],[p,r],[p],[q,r]] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | --Pedro G. Ros | |
− | + | modelosFormula :: Prop -> [Interpretacion] | |
− | + | modelosFormula f = [x|x<-(interpretacionesForm f),esModeloFormula x | |
− | + | f,not(null x)] | |
+ | |||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- 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 208: | Línea 222: | ||
-- esVálida ((p --> q) \/ (q --> p)) ==> True | -- 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 | -- Ejercicio 13: Definir la función | ||
Línea 220: | Línea 240: | ||
-- esInsatisfacible ((p --> q) /\ (q --> r)) ==> False | -- esInsatisfacible ((p --> q) /\ (q --> r)) ==> False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
+ | -- Reme Sillero | ||
+ | |||
esInsatisfacible :: Prop -> Bool | esInsatisfacible :: Prop -> Bool | ||
− | esInsatisfacible f = | + | esInsatisfacible f = modelosFormula f == [] |
− | + | ||
+ | --Pedro G. Ros | ||
+ | esInsatisfacible2 :: Prop-> Bool | ||
+ | esInsatisfacible2 f = esValida (no f) | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 14: Definir la función | -- Ejercicio 14: Definir la función | ||
Línea 232: | Línea 257: | ||
-- esSatisfacible ((p --> q) /\ (q --> r)) ==> True | -- esSatisfacible ((p --> q) /\ (q --> r)) ==> True | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | -- Reme Sillero | |
+ | |||
esSatisfacible :: Prop -> Bool | esSatisfacible :: Prop -> Bool | ||
− | esSatisfacible f = | + | esSatisfacible f = modelosFormula f /= [] |
− | + | ||
+ | -- Isabel Duarte | ||
+ | esSatisfacible2 :: Prop -> Bool | ||
+ | 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 249: | Línea 279: | ||
-- 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 263: | Línea 293: | ||
-- símbolosPropConj [p /\ q --> r, p --> s] ==> [p,q,r,s] | -- 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 -- | -- Interpretaciones de un conjunto de fórmulas -- | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 17: Definir la función | -- Ejercicio 17: Definir la función | ||
Línea 279: | Línea 311: | ||
-- ==> [[p,q,r],[p,q],[p,r],[p],[q,r],[q],[r],[]] | -- ==> [[p,q,r],[p,q],[p,r],[p],[q,r],[q],[r],[]] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
− | interpretacionesConjunto :: [Prop] -> [ | + | -- Reme Sillero |
− | interpretacionesConjunto s = | + | |
− | + | interpretacionesConjunto :: [Prop] -> [Interpretacion] | |
+ | 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 297: | Línea 331: | ||
-- ==> False | -- ==> False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
− | esModeloConjunto :: | + | --Isabel Duarte |
− | esModeloConjunto i s = | + | 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 | -- Ejercicio 19: Definir la función | ||
Línea 311: | Línea 351: | ||
-- ==> [[p,q,r],[p],[q,r]] | -- ==> [[p,q,r],[p],[q,r]] | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
− | modelosConjunto :: [Prop] -> [ | + | --Isabel Duarte |
− | modelosConjunto s = | + | modelosConjunto :: [Prop] -> [Interpretacion] |
− | + | 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 329: | Línea 371: | ||
-- ==> False | -- ==> False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
+ | --Jesús Horno Cobo | ||
esConsistente :: [Prop] -> Bool | esConsistente :: [Prop] -> Bool | ||
− | esConsistente s = | + | esConsistente s = modelosConjunto s /= [] |
− | + | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
-- Ejercicio 21: Definir la función | -- Ejercicio 21: Definir la función | ||
Línea 343: | Línea 386: | ||
-- ==> True | -- ==> True | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
+ | --Jesús Horno Cobo | ||
esInconsistente :: [Prop] -> Bool | esInconsistente :: [Prop] -> Bool | ||
− | esInconsistente 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 359: | Línea 403: | ||
-- esConsecuencia [p] (p /\ q) ==> False | -- esConsecuencia [p] (p /\ q) ==> False | ||
-- --------------------------------------------------------------------- | -- --------------------------------------------------------------------- | ||
− | + | ||
+ | --Jesús Horno Cobo | ||
esConsecuencia :: [Prop] -> Prop -> Bool | esConsecuencia :: [Prop] -> Prop -> Bool | ||
− | esConsecuencia s f = | + | esConsecuencia s f = esInconsistente ((no f):s) |
</source> | </source> |
Revisión actual del 15:52 15 may 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 (Neg(Neg p)) a = 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 | (significado p a) = (significado q a)
| otherwise = True
significado (Equi p q) a = (significado p a)==(significado q 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),esModeloFormula x
f,not(null x)]
-- ---------------------------------------------------------------------
-- 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)