<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/LMF2016/index.php?action=history&amp;feed=atom&amp;title=R11_sol</id>
	<title>R11 sol - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/LMF2016/index.php?action=history&amp;feed=atom&amp;title=R11_sol"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2016/index.php?title=R11_sol&amp;action=history"/>
	<updated>2026-07-19T00:55:57Z</updated>
	<subtitle>Historial de revisiones para esta página en el wiki</subtitle>
	<generator>MediaWiki 1.31.14</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/LMF2016/index.php?title=R11_sol&amp;diff=219&amp;oldid=prev</id>
		<title>Mjoseh: Página creada con &#039;&lt;source lang = &quot;haskell&quot;&gt; -- FormasNormales.hs -- Formas normales. -- ---------------------------------------------------------------------  module FormasNormales where  -- ----...&#039;</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/LMF2016/index.php?title=R11_sol&amp;diff=219&amp;oldid=prev"/>
		<updated>2016-05-03T12:41:58Z</updated>

		<summary type="html">&lt;p&gt;Página creada con &amp;#039;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt; -- FormasNormales.hs -- Formas normales. -- ---------------------------------------------------------------------  module FormasNormales where  -- ----...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nueva&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang = &amp;quot;haskell&amp;quot;&amp;gt;&lt;br /&gt;
-- FormasNormales.hs&lt;br /&gt;
-- Formas normales.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module FormasNormales where&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Librería suxiliares                                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
import SintaxisSemantica &lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Equivalencia lógica                                                --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 1: Definir la función&lt;br /&gt;
--    esEquivalente :: Prop -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (esEquivalente f g) se verifica si f y g son&lt;br /&gt;
-- equivalentes. Por ejemplo,&lt;br /&gt;
--    esEquivalente (p &amp;lt;--&amp;gt; q) ((p --&amp;gt; q) /\ (q --&amp;gt; p))  ==&amp;gt;  True&lt;br /&gt;
--    esEquivalente (p --&amp;gt; q)  ((no p) \/ q)             ==&amp;gt;  True&lt;br /&gt;
--    esEquivalente (p /\ q)   (no ((no p) \/ (no q)))   ==&amp;gt;  True&lt;br /&gt;
--    esEquivalente (p \/ q)   (no ((no p) /\ (no q)))   ==&amp;gt;  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esEquivalente :: Prop -&amp;gt; Prop -&amp;gt; Bool&lt;br /&gt;
esEquivalente f g = esValida (Equi f g)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Transformación a forma normal negativa                             --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 2: Definir la función&lt;br /&gt;
--    eliminaEquivalencias :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (eliminaEquivalencias f) es una fórmula equivalente a f sin&lt;br /&gt;
-- signos de equivalencia. Por ejemplo,&lt;br /&gt;
--    eliminaEquivalencias (p &amp;lt;--&amp;gt; q)&lt;br /&gt;
--    ==&amp;gt; ((p --&amp;gt; q) /\ (q --&amp;gt; p))&lt;br /&gt;
--    eliminaEquivalencias ((p &amp;lt;--&amp;gt; q) /\ (q &amp;lt;--&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; (((p --&amp;gt; q) /\ (q --&amp;gt; p)) /\ ((q --&amp;gt; r) /\ (r --&amp;gt; q)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
eliminaEquivalencias :: Prop -&amp;gt; Prop&lt;br /&gt;
eliminaEquivalencias (Atom f)   = &lt;br /&gt;
    (Atom f)&lt;br /&gt;
eliminaEquivalencias (Neg f)    = &lt;br /&gt;
    Neg (eliminaEquivalencias f) &lt;br /&gt;
eliminaEquivalencias (Conj f g) = &lt;br /&gt;
    Conj (eliminaEquivalencias f) (eliminaEquivalencias g) &lt;br /&gt;
eliminaEquivalencias (Disj f g) = &lt;br /&gt;
    Disj (eliminaEquivalencias f) (eliminaEquivalencias g) &lt;br /&gt;
eliminaEquivalencias (Impl f g) = &lt;br /&gt;
    Impl (eliminaEquivalencias f) (eliminaEquivalencias g) &lt;br /&gt;
eliminaEquivalencias (Equi f g) = &lt;br /&gt;
    Conj (Impl (eliminaEquivalencias f) (eliminaEquivalencias g))&lt;br /&gt;
         (Impl (eliminaEquivalencias g) (eliminaEquivalencias f))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 3: Definir la función&lt;br /&gt;
--    eliminaImplicaciones :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (eliminaImplicaciones f) es una fórmula equivalente a f sin&lt;br /&gt;
-- signos de implicación. Por ejemplo,&lt;br /&gt;
--    eliminaImplicaciones (p --&amp;gt; q)&lt;br /&gt;
--    ==&amp;gt; (no p \/ q)&lt;br /&gt;
--    eliminaImplicaciones (eliminaEquivalencias (p &amp;lt;--&amp;gt; q))&lt;br /&gt;
--    ==&amp;gt; ((no p \/ q) /\ (no q \/ p))&lt;br /&gt;
-- Nota: Se supone que f no tiene signos de equivalencia.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
eliminaImplicaciones :: Prop -&amp;gt; Prop&lt;br /&gt;
eliminaImplicaciones (Atom f)   = &lt;br /&gt;
    (Atom f)&lt;br /&gt;
eliminaImplicaciones (Neg f)    = &lt;br /&gt;
    Neg (eliminaImplicaciones f) &lt;br /&gt;
eliminaImplicaciones (Conj f g) = &lt;br /&gt;
    Conj (eliminaImplicaciones f) (eliminaImplicaciones g) &lt;br /&gt;
eliminaImplicaciones (Disj f g) = &lt;br /&gt;
    Disj (eliminaImplicaciones f) (eliminaImplicaciones g) &lt;br /&gt;
eliminaImplicaciones (Impl f g) = &lt;br /&gt;
    Disj (Neg (eliminaImplicaciones f)) (eliminaImplicaciones g) &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 4: Definir la función&lt;br /&gt;
--    interiorizaNegación :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (interiorizaNegación f) es una fórmula equivalente a f donde&lt;br /&gt;
-- las negaciones se aplican sólo a fórmulas atómicas. Por ejemplo,&lt;br /&gt;
--    interiorizaNegación (no (no p))         ==&amp;gt;  p&lt;br /&gt;
--    interiorizaNegación (no (p /\ q))       ==&amp;gt;  (no p \/ no q)&lt;br /&gt;
--    interiorizaNegación (no (p \/ q))       ==&amp;gt;  (no p /\ no q)&lt;br /&gt;
--    interiorizaNegación (no (no (p \/ q)))  ==&amp;gt;  (p \/ q)&lt;br /&gt;
--    interiorizaNegación (no ((no p) \/ q))  ==&amp;gt;  (p /\ no q)&lt;br /&gt;
-- Nota: Se supone que f no tiene equivalencias ni implicaciones. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interiorizaNegación :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaNegación (Atom f)   = &lt;br /&gt;
    (Atom f)&lt;br /&gt;
interiorizaNegación (Neg f)    = &lt;br /&gt;
    interiorizaNegaciónAux f&lt;br /&gt;
interiorizaNegación (Conj f g) = &lt;br /&gt;
    Conj (interiorizaNegación f) (interiorizaNegación g) &lt;br /&gt;
interiorizaNegación (Disj f g) = &lt;br /&gt;
    Disj (interiorizaNegación f) (interiorizaNegación g) &lt;br /&gt;
&lt;br /&gt;
interiorizaNegaciónAux :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaNegaciónAux (Atom f)   = &lt;br /&gt;
    Neg (Atom f)&lt;br /&gt;
interiorizaNegaciónAux (Neg f)    = &lt;br /&gt;
    interiorizaNegación f &lt;br /&gt;
interiorizaNegaciónAux (Conj f g) = &lt;br /&gt;
    Disj (interiorizaNegaciónAux f) (interiorizaNegaciónAux g) &lt;br /&gt;
interiorizaNegaciónAux (Disj f g) = &lt;br /&gt;
    Conj (interiorizaNegaciónAux f) (interiorizaNegaciónAux g) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 5: Definir la función&lt;br /&gt;
--    formaNormalNegativa :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (formaNormalNegativa f) es una fórmula equivalente a f en&lt;br /&gt;
-- forma normal negativa. Por ejemplo,&lt;br /&gt;
--    formaNormalNegativa (p &amp;lt;--&amp;gt; q)&lt;br /&gt;
--    ==&amp;gt; ((no p \/ q) /\ (no q \/ p))&lt;br /&gt;
--    formaNormalNegativa ((p \/ (no q)) --&amp;gt; r)&lt;br /&gt;
--    ==&amp;gt; ((no p /\ q) \/ r)&lt;br /&gt;
--    formaNormalNegativa ((p /\ (q --&amp;gt; r)) --&amp;gt; s)&lt;br /&gt;
--    ==&amp;gt; ((no p \/ (q /\ no r)) \/ s)&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formaNormalNegativa :: Prop -&amp;gt; Prop&lt;br /&gt;
formaNormalNegativa f =&lt;br /&gt;
    interiorizaNegación (eliminaImplicaciones (eliminaEquivalencias f))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Literales                                                          --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 6: Definir la función&lt;br /&gt;
--    literal :: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (literal f) se verifica si la fórmula F es un literal. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    literal p               ==&amp;gt;  True&lt;br /&gt;
--    literal (no p)          ==&amp;gt;  True&lt;br /&gt;
--    literal (no (p --&amp;gt; q))  ==&amp;gt;  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
literal :: Prop -&amp;gt; Bool&lt;br /&gt;
literal (Atom f)       = True&lt;br /&gt;
literal (Neg (Atom f)) = True&lt;br /&gt;
literal _              = False&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 7: Definir el tipo de dato Literal como sinónimo de&lt;br /&gt;
-- fórmula. &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
type Literal = Prop&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 8: Definir la función&lt;br /&gt;
--    complementario :: Literal -&amp;gt; Literal&lt;br /&gt;
-- tal que (complementario l) es el complementario de l. Por ejemplo,&lt;br /&gt;
--    complementario p       ==&amp;gt;  no p&lt;br /&gt;
--    complementario (no p)  ==&amp;gt;  p&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
complementario :: Literal -&amp;gt; Literal&lt;br /&gt;
complementario (Atom f)       = Neg (Atom f)&lt;br /&gt;
complementario (Neg (Atom f)) = Atom f&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 9: Definir la función&lt;br /&gt;
--    literalesFórmulaFNN :: Prop -&amp;gt; [Literal]&lt;br /&gt;
-- tal que (literalesFórmulaFNN f) es el conjunto de los literales de la&lt;br /&gt;
-- fórmula en forma normal negativa f.&lt;br /&gt;
--    literalesFórmulaFNN (p \/ ((no q) \/ r))  ==&amp;gt;  [p,no q,r]&lt;br /&gt;
--    literalesFórmulaFNN p                     ==&amp;gt;  [p]&lt;br /&gt;
--    literalesFórmulaFNN (no p)                ==&amp;gt;  [no p]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
literalesFórmulaFNN :: Prop -&amp;gt; [Literal]&lt;br /&gt;
literalesFórmulaFNN (Disj f g) =&lt;br /&gt;
    (literalesFórmulaFNN f) `union` (literalesFórmulaFNN g)&lt;br /&gt;
literalesFórmulaFNN (Conj f g) =&lt;br /&gt;
    (literalesFórmulaFNN f) `union` (literalesFórmulaFNN g)&lt;br /&gt;
literalesFórmulaFNN f          = [f]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Transformación a forma normal conjuntiva                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 10: Definir la función&lt;br /&gt;
--    interiorizaDisyunción :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (interiorizaDisyunción f) es una fórmula equivalente a f&lt;br /&gt;
-- donde las disyunciones sólo se aplica a disyunciones o literales. Por&lt;br /&gt;
-- ejemplo,  &lt;br /&gt;
--    interiorizaDisyunción (p \/ (q /\ r))  ==&amp;gt;  ((p \/ q) /\ (p \/ r))&lt;br /&gt;
--    interiorizaDisyunción ((p /\ q) \/ r)  ==&amp;gt;  ((p \/ r) /\ (q \/ r))&lt;br /&gt;
-- Nota: Se supone que f está en forma normal negativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interiorizaDisyunción :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaDisyunción (Disj (Conj f1 f2) g) =&lt;br /&gt;
    interiorizaDisyunción &lt;br /&gt;
    (Conj (Disj (interiorizaDisyunción f1) (interiorizaDisyunción g))&lt;br /&gt;
          (Disj (interiorizaDisyunción f2) (interiorizaDisyunción g)))&lt;br /&gt;
interiorizaDisyunción (Disj f (Conj g1 g2)) =&lt;br /&gt;
    interiorizaDisyunción&lt;br /&gt;
    (Conj (Disj (interiorizaDisyunción f) (interiorizaDisyunción g1))&lt;br /&gt;
          (Disj (interiorizaDisyunción f) (interiorizaDisyunción g2)))&lt;br /&gt;
interiorizaDisyunción (Conj f g) =&lt;br /&gt;
    Conj (interiorizaDisyunción f) (interiorizaDisyunción g)&lt;br /&gt;
interiorizaDisyunción f = f&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 11: Definir la función&lt;br /&gt;
--    formaNormalConjuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (formaNormalConjuntiva f) es una fórmula equivalente a f en&lt;br /&gt;
-- forma normal conjuntiva. Por ejemplo,&lt;br /&gt;
--    formaNormalConjuntiva (p /\ (q --&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; (p /\ (no q \/ r))&lt;br /&gt;
--    formaNormalConjuntiva (no (p /\ (q --&amp;gt; r)))&lt;br /&gt;
--    ==&amp;gt; ((no p \/ q) /\ (no p \/ no r))&lt;br /&gt;
--    formaNormalConjuntiva (no(p &amp;lt;--&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; (((p \/ r) /\ (p \/ no p)) /\ ((no r \/ r) /\ (no r \/ no p)))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formaNormalConjuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
formaNormalConjuntiva f =&lt;br /&gt;
    interiorizaDisyunción (formaNormalNegativa f)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Ejercicio 11.2: Definir la función&lt;br /&gt;
--    validaPorFNC:: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (validaPorFNC f) comprueba si f es válida. Por ejemplo,&lt;br /&gt;
--    validaPorFNC ((p --&amp;gt; q) \/ (q --&amp;gt; p))    == True&lt;br /&gt;
--    validaPorFNC ((p \/ q) /\ ((no q) \/ r)) == False&lt;br /&gt;
--    validaPorFNC (p --&amp;gt; p)                   == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
validaPorFNC:: Prop -&amp;gt; Bool&lt;br /&gt;
validaPorFNC f = all tieneParComplementario (listaLiterales f)&lt;br /&gt;
    where tieneParComplementario xs = or [(complementario p) `elem` xs | p &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
listaLiterales :: Prop -&amp;gt; [[Prop]]&lt;br /&gt;
listaLiterales f = &lt;br /&gt;
    map listaLiteralesDisyuncion &lt;br /&gt;
            (listaDisyuncionesFNC (formaNormalConjuntiva f))&lt;br /&gt;
&lt;br /&gt;
listaDisyuncionesFNC :: Prop -&amp;gt; [Prop]&lt;br /&gt;
listaDisyuncionesFNC (Conj f g) = (listaDisyuncionesFNC f) `union`&lt;br /&gt;
                                  (listaDisyuncionesFNC g)         &lt;br /&gt;
listaDisyuncionesFNC f = [f]&lt;br /&gt;
&lt;br /&gt;
listaLiteralesDisyuncion :: Prop -&amp;gt; [Prop]&lt;br /&gt;
listaLiteralesDisyuncion (Disj f g) = (listaLiteralesDisyuncion f) `union`&lt;br /&gt;
                                      (listaLiteralesDisyuncion g)&lt;br /&gt;
listaLiteralesDisyuncion f = [f]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Transformación a forma normal disyuntiva                           --&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 12: Definir la función&lt;br /&gt;
--    interiorizaConjunción :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (interiorizaConjunción f) es una fórmula equivalente a f&lt;br /&gt;
-- donde las conjunciones sólo se aplica a conjunciones o literales. Por&lt;br /&gt;
-- ejemplo,  &lt;br /&gt;
--    interiorizaConjunción (p /\ (q \/ r))  ==&amp;gt;  ((p /\ q) \/ (p /\ r))&lt;br /&gt;
--    interiorizaConjunción ((p \/ q) /\ r)  ==&amp;gt;  ((p /\ r) \/ (q /\ r))&lt;br /&gt;
-- Nota: Se supone que f está en forma normal negativa.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interiorizaConjunción :: Prop -&amp;gt; Prop&lt;br /&gt;
interiorizaConjunción (Conj (Disj f1 f2) g) =&lt;br /&gt;
    interiorizaConjunción&lt;br /&gt;
    (Disj (Conj (interiorizaConjunción f1) (interiorizaConjunción g))&lt;br /&gt;
          (Conj (interiorizaConjunción f2) (interiorizaConjunción g)))&lt;br /&gt;
interiorizaConjunción (Conj f (Disj g1 g2)) =&lt;br /&gt;
    interiorizaConjunción&lt;br /&gt;
    (Disj (Conj (interiorizaConjunción f) (interiorizaConjunción g1))&lt;br /&gt;
          (Conj (interiorizaConjunción f) (interiorizaConjunción g2)))&lt;br /&gt;
interiorizaConjunción (Disj f g) =&lt;br /&gt;
    Disj (interiorizaConjunción f) (interiorizaConjunción g)&lt;br /&gt;
interiorizaConjunción f = f&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 13: Definir la función&lt;br /&gt;
--    formaNormalDisyuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
-- tal que (formaNormalDisyuntiva f) es una fórmula equivalente a f en&lt;br /&gt;
-- forma normal disyuntiva. Por ejemplo,&lt;br /&gt;
--    formaNormalDisyuntiva (p /\ (q --&amp;gt; r))&lt;br /&gt;
--    ==&amp;gt; ((p /\ no q) \/ (p /\ r))&lt;br /&gt;
--    formaNormalDisyuntiva (no (p /\ (q --&amp;gt; r)))&lt;br /&gt;
--    ==&amp;gt; (no p \/ (q /\ no r))&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formaNormalDisyuntiva :: Prop -&amp;gt; Prop&lt;br /&gt;
formaNormalDisyuntiva f =&lt;br /&gt;
    interiorizaConjunción (formaNormalNegativa f)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio 14: Definir la función&lt;br /&gt;
--     satisfaciblePorFND:: Prop -&amp;gt; Bool&lt;br /&gt;
-- tal que (satisfaciblePorFND f) comprueba si f es satisfacible. Por&lt;br /&gt;
-- ejemplo,&lt;br /&gt;
--     satisfaciblePorFND ((p \/ q) /\ ((no q) \/ r)) == True&lt;br /&gt;
--     satisfaciblePorFND (p /\ (no p))               == False&lt;br /&gt;
--     satisfaciblePorFND ((p --&amp;gt; q) \/ (q --&amp;gt; p))    == True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
satisfaciblePorFND:: Prop -&amp;gt; Bool&lt;br /&gt;
satisfaciblePorFND f = any noTieneParComplementario (listaLiterales&amp;#039; f)&lt;br /&gt;
    where noTieneParComplementario xs = &lt;br /&gt;
              and [not ((complementario p) `elem` xs) | p &amp;lt;- xs]&lt;br /&gt;
&lt;br /&gt;
listaLiterales&amp;#039; :: Prop -&amp;gt; [[Prop]]&lt;br /&gt;
listaLiterales&amp;#039; f = &lt;br /&gt;
    map listaLiteralesConjuncion &lt;br /&gt;
            (listaConjuncionesFND (formaNormalDisyuntiva f))&lt;br /&gt;
&lt;br /&gt;
listaConjuncionesFND :: Prop -&amp;gt; [Prop]&lt;br /&gt;
listaConjuncionesFND (Disj f g) = (listaConjuncionesFND f) `union`&lt;br /&gt;
                                  (listaConjuncionesFND g)         &lt;br /&gt;
listaConjuncionesFND f = [f]&lt;br /&gt;
&lt;br /&gt;
listaLiteralesConjuncion :: Prop -&amp;gt; [Prop]&lt;br /&gt;
listaLiteralesConjuncion (Conj f g) = (listaLiteralesConjuncion f) `union`&lt;br /&gt;
                                      (listaLiteralesConjuncion g)&lt;br /&gt;
listaLiteralesConjuncion f = [f]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mjoseh</name></author>
		
	</entry>
</feed>