Relación 9
De Lógica matemática y fundamentos (2014-15)
Revisión del 19:53 25 abr 2015 de Fracarmol1 (discusión | contribuciones)
-- FormasNormales.hs
-- Formas normales.
-- ---------------------------------------------------------------------
module FormasNormales where
-- ---------------------------------------------------------------------
-- Librería suxiliares --
-- ---------------------------------------------------------------------
import SintaxisSemantica
import Data.List
-- ---------------------------------------------------------------------
-- Equivalencia lógica --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Ejercicio 1: Definir la función
-- esEquivalente :: Prop -> Prop -> Bool
-- tal que (esEquivalente f g) se verifica si f y g son
-- equivalentes. Por ejemplo,
-- esEquivalente (p <--> q) ((p --> q) /\ (q --> p)) ==> True
-- esEquivalente (p --> q) ((no p) \/ q) ==> True
-- esEquivalente (p /\ q) (no ((no p) \/ (no q))) ==> True
-- esEquivalente (p \/ q) (no ((no p) /\ (no q))) ==> True
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
esEquivalente :: Prop -> Prop -> Bool
esEquivalente f g = esValida (Equi f g)
-- ---------------------------------------------------------------------
-- Transformación a forma normal negativa --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Ejercicio 2: Definir la función
-- eliminaEquivalencias :: Prop -> Prop
-- tal que (eliminaEquivalencias f) es una fórmula equivalente a f sin
-- signos de equivalencia. Por ejemplo,
-- eliminaEquivalencias (p <--> q)
-- ==> ((p --> q) /\ (q --> p))
-- eliminaEquivalencias ((p <--> q) /\ (q <--> r))
-- ==> (((p --> q) /\ (q --> p)) /\ ((q --> r) /\ (r --> q)))
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
eliminaEquivalencias :: Prop -> Prop
eliminaEquivalencias (Equi h g) = Conj (Impl (eliminaEquivalencias h) (eliminaEquivalencias g))
(Impl (eliminaEquivalencias g)
(eliminaEquivalencias h))
eliminaEquivalencias (Impl h g) = Impl (eliminaEquivalencias h)
(eliminaEquivalencias g)
eliminaEquivalencias (Conj h g) = Conj (eliminaEquivalencias h)
(eliminaEquivalencias g)
eliminaEquivalencias (Disj h g) = Disj (eliminaEquivalencias h)
(eliminaEquivalencias g)
eliminaEquivalencias (Neg h) = Neg (eliminaEquivalencias h)
eliminaEquivalencias (Atom h) = Atom h
-- ---------------------------------------------------------------------
-- Ejercicio 3: Definir la función
-- eliminaImplicaciones :: Prop -> Prop
-- tal que (eliminaImplicaciones f) es una fórmula equivalente a f sin
-- signos de implicación. Por ejemplo,
-- eliminaImplicaciones (p --> q)
-- ==> (no p \/ q)
-- eliminaImplicaciones (eliminaEquivalencias (p <--> q))
-- ==> ((no p \/ q) /\ (no q \/ p))
-- Nota: Se supone que f no tiene signos de equivalencia.
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
eliminaImplicaciones :: Prop -> Prop
eliminaImplicaciones (Impl h g) = Disj (Neg (eliminaImplicaciones h)) (eliminaImplicaciones g)
eliminaImplicaciones (Conj h g) = Conj (eliminaImplicaciones h)
(eliminaImplicaciones g)
eliminaImplicaciones (Disj h g) = Disj (eliminaImplicaciones h)
(eliminaImplicaciones g)
eliminaImplicaciones (Neg h) = Neg (eliminaImplicaciones h)
eliminaImplicaciones (Atom h) = Atom h
-- ---------------------------------------------------------------------
-- Ejercicio 4: Definir la función
-- interiorizaNegación :: Prop -> Prop
-- tal que (interiorizaNegación f) es una fórmula equivalente a f donde
-- las negaciones se aplican sólo a fórmulas atómicas. Por ejemplo,
-- interiorizaNegación (no (no p)) ==> p
-- interiorizaNegación (no (p /\ q)) ==> (no p \/ no q)
-- interiorizaNegación (no (p \/ q)) ==> (no p /\ no q)
-- interiorizaNegación (no (no (p \/ q))) ==> (p \/ q)
-- interiorizaNegación (no ((no p) \/ q)) ==> (p /\ no q)
-- Nota: Se supone que f no tiene equivalencias ni implicaciones.
-- ---------------------------------------------------------------------
interiorizaNegación :: Prop -> Prop
interiorizaNegación = undefined
-- ---------------------------------------------------------------------
-- Ejercicio 5: Definir la función
-- formaNormalNegativa :: Prop -> Prop
-- tal que (formaNormalNegativa f) es una fórmula equivalente a f en
-- forma normal negativa. Por ejemplo,
-- formaNormalNegativa (p <--> q)
-- ==> ((no p \/ q) /\ (no q \/ p))
-- formaNormalNegativa ((p \/ (no q)) --> r)
-- ==> ((no p /\ q) \/ r)
-- formaNormalNegativa ((p /\ (q --> r)) --> s)
-- ==> ((no p \/ (q /\ no r)) \/ s)
-- ---------------------------------------------------------------------
formaNormalNegativa :: Prop -> Prop
formaNormalNegativa f = undefined
-- ---------------------------------------------------------------------
-- Literales --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Ejercicio 6: Definir la función
-- literal :: Prop -> Bool
-- tal que (literal f) se verifica si la fórmula F es un literal. Por
-- ejemplo,
-- literal p ==> True
-- literal (no p) ==> True
-- literal (no (p --> q)) ==> False
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
literal :: Prop -> Bool
literal (Atom f) = True
literal (Neg (Atom f)) = True
literal _ = False
-- ---------------------------------------------------------------------
-- Ejercicio 7: Definir el tipo de dato Literal como sinónimo de
-- fórmula.
-- ---------------------------------------------------------------------
type Literal = Prop
-- ---------------------------------------------------------------------
-- Ejercicio 8: Definir la función
-- complementario :: Literal -> Literal
-- tal que (complementario l) es el complementario de l. Por ejemplo,
-- complementario p ==> no p
-- complementario (no p) ==> p
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
complementario :: Literal -> Literal
complementario (Atom f ) = Neg (Atom f)
complementario (Neg (Atom f)) = (Atom f)
-- ---------------------------------------------------------------------
-- Ejercicio 9: Definir la función
-- literalesFórmulaFNN :: Prop -> [Literal]
-- tal que (literalesFórmulaFNN f) es el conjunto de los literales de la
-- fórmula en forma normal negativa f.
-- literalesFórmulaFNN (p \/ ((no q) \/ r)) ==> [p,no q,r]
-- literalesFórmulaFNN p ==> [p]
-- literalesFórmulaFNN (no p) ==> [no p]
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
literalesFormulaFNN :: Prop -> [Literal]
literalesFormulaFNN (Atom f) = [Atom f]
literalesFormulaFNN (Neg f) | literal (Neg f) = [(Neg f)]
| otherwise = literalesFormulaFNN f
literalesFormulaFNN (Disj f g) = nub (aux f g)
literalesFormulaFNN (Conj f g) = nub (aux f g)
aux f g | literal f = [f] ++ literalesFormulaFNN g
| literal g = [g] ++ literalesFormulaFNN f
| literal f && literal g = [f,g]
| otherwise = literalesFormulaFNN f ++ literalesFormulaFNN g
-- ---------------------------------------------------------------------
-- Transformación a forma normal conjuntiva --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Ejercicio 10: Definir la función
-- interiorizaDisyunción :: Prop -> Prop
-- tal que (interiorizaDisyunción f) es una fórmula equivalente a f
-- donde las disyunciones sólo se aplica a disyunciones o literales. Por
-- ejemplo,
-- interiorizaDisyunción (p \/ (q /\ r)) ==> ((p \/ q) /\ (p \/ r))
-- interiorizaDisyunción ((p /\ q) \/ r) ==> ((p \/ r) /\ (q \/ r))
-- Nota: Se supone que f está en forma normal negativa.
-- ---------------------------------------------------------------------
interiorizaDisyunción :: Prop -> Prop
interiorizaDisyunción = undefined
-- ---------------------------------------------------------------------
-- Ejercicio 11: Definir la función
-- formaNormalConjuntiva :: Prop -> Prop
-- tal que (formaNormalConjuntiva f) es una fórmula equivalente a f en
-- forma normal conjuntiva. Por ejemplo,
-- formaNormalConjuntiva (p /\ (q --> r))
-- ==> (p /\ (no q \/ r))
-- formaNormalConjuntiva (no (p /\ (q --> r)))
-- ==> ((no p \/ q) /\ (no p \/ no r))
-- formaNormalConjuntiva (no(p <--> r))
-- ==> (((p \/ r) /\ (p \/ no p)) /\ ((no r \/ r) /\ (no r \/ no p)))
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
formaNormalConjuntiva :: Prop -> Prop
formaNormalConjuntiva f = interiorizaDisyuncion (interiorizaNegacion
(eliminaImplicaciones (eliminaEquivalencias f)))
-- ---------------------------------------------------------------------
-- Ejercicio 11.2: Definir la función
-- validaPorFNC:: Prop -> Bool
-- tal que (validaPorFNC f) comprueba si f es válida. Por ejemplo,
-- validaPorFNC ((p --> q) \/ (q --> p)) == True
-- validaPorFNC ((p \/ q) /\ ((no q) \/ r)) == False
-- validaPorFNC (p --> p) == True
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
validaPorFNC:: Prop -> Bool
validaPorFNC f = valida (formaNormalConjuntiva f) f
valida (Disj f g) y = aux (conjunto y)
where aux [] = True
aux (x:xs) = elem (complementario x) xs
||aux xs
valida (Conj f g) y = (comprobacion y)
conjunto x = literalesFormulaFNN1 (formaNormalConjuntiva x)
ordenaEnPares f = aux (conjunto f)
where aux [] = []
aux xs = [take 2 xs] ++ aux (drop 2 xs)
comprobacion f = or [elem (complementario (head x)) (drop 1 x)
| x <- ordenaEnPares f]
literalesFormulaFNN1 :: Prop -> [Literal]
literalesFormulaFNN1 (Atom f) = [Atom f]
literalesFormulaFNN1 (Neg f) | literal (Neg f) = [(Neg f)]
| otherwise = literalesFormulaFNN1 f
literalesFormulaFNN1 (Disj f g) = (aux1 f g)
literalesFormulaFNN1 (Conj f g) = (aux1 f g)
aux1 f g | literal f = [f] ++ literalesFormulaFNN1 g
| literal g = [g] ++ literalesFormulaFNN1 f
| literal f && literal g = [f,g]
| otherwise = literalesFormulaFNN1 f ++ literalesFormulaFNN1 g
-- ---------------------------------------------------------------------
-- Transformación a forma normal disyuntiva --
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Ejercicio 12: Definir la función
-- interiorizaConjunción :: Prop -> Prop
-- tal que (interiorizaConjunción f) es una fórmula equivalente a f
-- donde las conjunciones sólo se aplica a conjunciones o literales. Por
-- ejemplo,
-- interiorizaConjunción (p /\ (q \/ r)) ==> ((p /\ q) \/ (p /\ r))
-- interiorizaConjunción ((p \/ q) /\ r) ==> ((p /\ r) \/ (q /\ r))
-- Nota: Se supone que f está en forma normal negativa.
-- ---------------------------------------------------------------------
interiorizaConjunción :: Prop -> Prop
interiorizaConjunción = undefined
-- ---------------------------------------------------------------------
-- Ejercicio 13: Definir la función
-- formaNormalDisyuntiva :: Prop -> Prop
-- tal que (formaNormalDisyuntiva f) es una fórmula equivalente a f en
-- forma normal disyuntiva. Por ejemplo,
-- formaNormalDisyuntiva (p /\ (q --> r))
-- ==> ((p /\ no q) \/ (p /\ r))
-- formaNormalDisyuntiva (no (p /\ (q --> r)))
-- ==> (no p \/ (q /\ no r))
-- ---------------------------------------------------------------------
-- Francisco Javier Carmona
formaNormalDisyuntiva :: Prop -> Prop
formaNormalDisyuntiva f = interiorizaConjuncion (formaNormalNegativa f)
-- ---------------------------------------------------------------------
-- Ejercicio 14: Definir la función
-- satisfaciblePorFND:: Prop -> Bool
-- tal que (satisfaciblePorFND f) comprueba si f es satisfacible. Por
-- ejemplo,
-- satisfaciblePorFND ((p \/ q) /\ ((no q) \/ r)) == True
-- satisfaciblePorFND (p /\ (no p)) == False
-- satisfaciblePorFND ((p --> q) \/ (q --> p)) == True
-- ---------------------------------------------------------------------
satisfaciblePorFND:: Prop -> Bool
satisfaciblePorFND f = undefined