<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
	<id>https://www.glc.us.es/~jalonso/RA2019/index.php?action=history&amp;feed=atom&amp;title=El_problema_SAT_en_Haskell</id>
	<title>El problema SAT en Haskell - Historial de revisiones</title>
	<link rel="self" type="application/atom+xml" href="https://www.glc.us.es/~jalonso/RA2019/index.php?action=history&amp;feed=atom&amp;title=El_problema_SAT_en_Haskell"/>
	<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2019/index.php?title=El_problema_SAT_en_Haskell&amp;action=history"/>
	<updated>2026-07-19T00:31:34Z</updated>
	<subtitle>Historial de revisiones de esta página en el wiki</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://www.glc.us.es/~jalonso/RA2019/index.php?title=El_problema_SAT_en_Haskell&amp;diff=968&amp;oldid=prev</id>
		<title>Jalonso: Página creada con «&lt;source lang=&quot;haskell&quot;&gt; -- SAT.hs -- El problema SAT para fóemulas en FNC. -- José A. Alonso Jiménez &lt;jalonso@us,es&gt; -- Sevilla, 4 de febrero de 2020 -- ----------------…»</title>
		<link rel="alternate" type="text/html" href="https://www.glc.us.es/~jalonso/RA2019/index.php?title=El_problema_SAT_en_Haskell&amp;diff=968&amp;oldid=prev"/>
		<updated>2020-02-06T10:23:09Z</updated>

		<summary type="html">&lt;p&gt;Página creada con «&amp;lt;source lang=&amp;quot;haskell&amp;quot;&amp;gt; -- SAT.hs -- El problema SAT para fóemulas en FNC. -- José A. Alonso Jiménez &amp;lt;jalonso@us,es&amp;gt; -- Sevilla, 4 de febrero de 2020 -- ----------------…»&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;
-- SAT.hs&lt;br /&gt;
-- El problema SAT para fóemulas en FNC.&lt;br /&gt;
-- José A. Alonso Jiménez &amp;lt;jalonso@us,es&amp;gt;&lt;br /&gt;
-- Sevilla, 4 de febrero de 2020&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module SAT where&lt;br /&gt;
&lt;br /&gt;
import Data.List&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Átomos, literales, cláusulas y FNC&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Usareremos las siguientes representaciones:&lt;br /&gt;
-- + Los átomos se representan por enteros positivos. Por ejemplo, 3&lt;br /&gt;
--   representa x(3). &lt;br /&gt;
-- + Los literales se representa por enteros. Por ejemplo, 3 reprsenta&lt;br /&gt;
--   el literal positivo x(3) y -5 el literal negativo -x(3).&lt;br /&gt;
-- + Una cláusula es una lista de literales que representa su&lt;br /&gt;
--   disyunción. Por ejemplo, [3,2,-4] representa a x(3) v x(2) v -x(4).&lt;br /&gt;
-- + Una fórmula en forma normal conjuntiva (FNC) es una lista de&lt;br /&gt;
--   cláusulas que representa su conjunción. Por ejemplo, [[3,2],[-1,2,5]]&lt;br /&gt;
--   representa a (x(3) v x(2)) &amp;amp; (-x(1) v x(2) v x(5)).&lt;br /&gt;
--&lt;br /&gt;
-- Definir los tipo de datos Atomo, Literal, Clausula y FNC.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
type Atomo    = Int&lt;br /&gt;
type Literal  = Int&lt;br /&gt;
type Clausula = [Literal]&lt;br /&gt;
type FNC      = [Clausula]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. 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 3  ==  -3&lt;br /&gt;
--    complementario (-3)  ==  3&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
complementario :: Literal -&amp;gt; Literal&lt;br /&gt;
complementario l = (-1) * l&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Átomos de cláusulas y de FNC&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    atomosClausula :: Clausula -&amp;gt; [Prop]&lt;br /&gt;
-- tal que (atomosClausula c) es el conjunto de los átomos de c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    atomosClausula [1,3,-1] == [1,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
atomosClausula :: Clausula -&amp;gt; [Atomo]&lt;br /&gt;
atomosClausula c = nub (map abs c)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    unionGeneral :: Eq a =&amp;gt; [[a]] -&amp;gt; [a]&lt;br /&gt;
-- tal que (unionGeneral x) es la unión de los conjuntos de la lista de&lt;br /&gt;
-- conjuntos x. Por ejemplo,&lt;br /&gt;
--    unionGeneral []                 ==  []&lt;br /&gt;
--    unionGeneral [[1]]              ==  [1]&lt;br /&gt;
--    unionGeneral [[1],[1,2],[2,3]]  ==  [1,2,3]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
unionGeneral :: Eq a =&amp;gt; [[a]] -&amp;gt; [a]&lt;br /&gt;
unionGeneral []     = []&lt;br /&gt;
unionGeneral (x:xs) = x `union` unionGeneral xs &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    atomosFNC :: FNC -&amp;gt; [Prop]&lt;br /&gt;
-- tal que (atomosFNC f) es el conjunto de los átomos de f. Por ejemplo, &lt;br /&gt;
--    atomosFNC [[1,2],[4,-2]] == [1,2,4]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
atomosFNC :: FNC -&amp;gt; [Atomo]&lt;br /&gt;
atomosFNC f = unionGeneral [atomosClausula c | c &amp;lt;- f]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Interpretaciones &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Una interpretación I es un conjunto de átomos. Se supone&lt;br /&gt;
-- que los átomos de I son verdaderos y los restantes son falsos.&lt;br /&gt;
--&lt;br /&gt;
-- Definir el tipo de dato Interpretacion.&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
type Interpretacion = [Atomo]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    interpretacionesClausula :: Clausula -&amp;gt; [Interpretacion]&lt;br /&gt;
-- tal que (interpretacionesClausula c) es el conjunto de&lt;br /&gt;
-- interpretaciones de c. Por ejemplo,&lt;br /&gt;
--    interpretacionesClausula [1,2,-1]  ==  [[],[1],[2],[1,2]]&lt;br /&gt;
--    interpretacionesClausula []        ==  [[]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interpretacionesClausula :: Clausula -&amp;gt; [Interpretacion]&lt;br /&gt;
interpretacionesClausula c = subsequences (atomosClausula c)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    interpretaciones :: FNC -&amp;gt; [Interpretacion]&lt;br /&gt;
-- tal que (interpretaciones f) es el conjunto de interpretaciones de&lt;br /&gt;
-- f. Por ejemplo, &lt;br /&gt;
--    interpretaciones [[1,-2],[-1,2]] == [[],[1],[2],[1,2]]&lt;br /&gt;
--    interpretaciones []              == [[]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
interpretaciones :: FNC -&amp;gt; [Interpretacion]&lt;br /&gt;
interpretaciones f = subsequences (atomosFNC f)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Modelos de literales, cláusulas y FNC &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esModeloLiteral :: Interpretacion -&amp;gt; Literal -&amp;gt; Bool&lt;br /&gt;
-- tal que (esModeloLiteral i l) se verifica si i es modelo de l. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esModeloLiteral [3,5] 3     ==  True&lt;br /&gt;
--    esModeloLiteral [3,5] 4     ==  False&lt;br /&gt;
--    esModeloLiteral [3,5] (-3)  ==  False&lt;br /&gt;
--    esModeloLiteral [3,5] (-4)  ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esModeloLiteral :: Interpretacion -&amp;gt; Literal -&amp;gt; Bool&lt;br /&gt;
esModeloLiteral i l&lt;br /&gt;
  | l &amp;gt; 0     = l `elem` i&lt;br /&gt;
  | otherwise = complementario l `notElem` i&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esModeloClausula :: Interpretacion -&amp;gt; Clausula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esModeloClausula i c) se verifica si i es modelo de c . Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    esModeloClausula [3,5] [2,3,-5]  ==  True&lt;br /&gt;
--    esModeloClausula [3,5] [2,4,-1]  ==  True&lt;br /&gt;
--    esModeloClausula [3,5] [2,4,1]  ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esModeloClausula :: Interpretacion -&amp;gt; Clausula -&amp;gt; Bool&lt;br /&gt;
esModeloClausula i c = or [esModeloLiteral i l | l &amp;lt;- c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    modelosClausula :: Clausula -&amp;gt; [Interpretacion]&lt;br /&gt;
-- tal que (modelosClausula c) es la lista de los modelos de c. Por&lt;br /&gt;
-- ejemplo, &lt;br /&gt;
--    modelosClausula [-1,2]  ==  [[],[2],[1,2]]&lt;br /&gt;
--    modelosClausula [-1,1]  ==  [[],[1]]&lt;br /&gt;
--    modelosClausula []      ==  []&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
modelosClausula :: Clausula -&amp;gt; [Interpretacion]&lt;br /&gt;
modelosClausula c =&lt;br /&gt;
  [i | i &amp;lt;- interpretacionesClausula c,&lt;br /&gt;
       esModeloClausula i c]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esModelo :: Interpretacion -&amp;gt; FNC -&amp;gt; Bool&lt;br /&gt;
-- tal que (esModelo i f) se verifica si i es modelo de f. Por ejemplo,&lt;br /&gt;
--    esModelo [1,3] [[1,-2],[3]]  ==  True&lt;br /&gt;
--    esModelo [1]   [[1,-2],[3]]  ==  False&lt;br /&gt;
--    esModelo [1]   []            ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esModelo :: Interpretacion -&amp;gt; FNC -&amp;gt; Bool&lt;br /&gt;
esModelo i s =&lt;br /&gt;
  and [esModeloClausula i c | c &amp;lt;- s]&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    modelos :: FNC -&amp;gt; [Interpretacion]&lt;br /&gt;
-- tal que (modelos f) es la lista de los modelos de f. Por ejemplo, &lt;br /&gt;
--    modelos [[-1,2],[-2,1]]    ==  [[],[1,2]]&lt;br /&gt;
--    modelos [[-1,2],[-2],[1]]  ==  []&lt;br /&gt;
--    modelos [[1,-1,2]]         ==  [[],[1],[2],[1,2]]&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
modelos :: FNC -&amp;gt; [Interpretacion]&lt;br /&gt;
modelos s =&lt;br /&gt;
  [i | i &amp;lt;- interpretaciones s,&lt;br /&gt;
       esModelo i s] &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § Cláusulas válidas, satisfacibles e insatisfacibles                &lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esSatisfacibleClausula :: Clausula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSatisfacibleClausula c) se verifica si la cláusula c es&lt;br /&gt;
-- satisfacible. Por ejemplo, &lt;br /&gt;
--    esSatisfacibleClausula [1,2,-1]  ==  True&lt;br /&gt;
--    esSatisfacibleClausula [1,2,-3]  ==  True&lt;br /&gt;
--    esSatisfacibleClausula []        ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
esSatisfacibleClausula1 :: Clausula -&amp;gt; Bool&lt;br /&gt;
esSatisfacibleClausula1 c =&lt;br /&gt;
  or [esModeloClausula i c | i &amp;lt;- interpretacionesClausula c]&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
esSatisfacibleClausula :: Clausula -&amp;gt; Bool&lt;br /&gt;
esSatisfacibleClausula = not . null &lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esInsatisfacibleClausula :: Clausula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esInsatisfacibleClausula c) se verifica si la cláusula c es&lt;br /&gt;
-- insatisfacible. Por ejemplo, &lt;br /&gt;
--    esInsatisfacibleClausula [1,2,-1]  ==  False&lt;br /&gt;
--    esInsatisfacibleClausula [1,2,-3]  ==  False&lt;br /&gt;
--    esInsatisfacibleClausula []        ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
esInsatisfacibleClausula1 :: Clausula -&amp;gt; Bool&lt;br /&gt;
esInsatisfacibleClausula1 c =&lt;br /&gt;
   and [not (esModeloClausula i c) | i &amp;lt;- interpretacionesClausula c]&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
esInsatisfacibleClausula :: Clausula -&amp;gt; Bool&lt;br /&gt;
esInsatisfacibleClausula  = null&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esValidaClausula :: Clausula -&amp;gt; Bool&lt;br /&gt;
-- tal que (esValidaClausula c) se verifica si la cláusula c es&lt;br /&gt;
-- válida. Por ejemplo, &lt;br /&gt;
--    esValidaClausula [1,2,-1]  ==  True&lt;br /&gt;
--    esValidaClausula [1,2,-3]  ==  False&lt;br /&gt;
--    esValidaClausula []        ==  False&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
esValidaClausula1 :: Clausula -&amp;gt; Bool&lt;br /&gt;
esValidaClausula1 c =&lt;br /&gt;
  and [esModeloClausula i c | i &amp;lt;- interpretacionesClausula c]&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
esValidaClausula :: Clausula -&amp;gt; Bool&lt;br /&gt;
esValidaClausula c =&lt;br /&gt;
  not (null [l | l &amp;lt;- c, complementario l `elem` c])&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- § FNC válidas, satisfacible e insatisfacibles&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esSatisfacible :: FNC -&amp;gt; Bool&lt;br /&gt;
-- tal que (esSatisfacible f) se verifica si la FNC f es&lt;br /&gt;
-- satistacible. Por ejemplo, &lt;br /&gt;
--    esSatisfacible [[-1,2],[-2,1]]  ==  True&lt;br /&gt;
--    esSatisfacible [[-1,2],[-2,2]]  ==  True&lt;br /&gt;
--    esSatisfacible [[-1,1],[-2,2]]  ==  True&lt;br /&gt;
--    esSatisfacible []               ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esSatisfacible :: FNC -&amp;gt; Bool&lt;br /&gt;
esSatisfacible s =&lt;br /&gt;
  not (null (modelos s))&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esInsatisfacible :: FNC -&amp;gt; Bool&lt;br /&gt;
-- tal que (esInsatisfacible f) se verifica si la FNC f es&lt;br /&gt;
-- insatisfacible. Por ejemplo,&lt;br /&gt;
--    esInsatisfacible [[-1,2],[-2,1]]  ==  False&lt;br /&gt;
--    esInsatisfacible [[-1],[1]]       ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
esInsatisfacible :: FNC -&amp;gt; Bool&lt;br /&gt;
esInsatisfacible f =&lt;br /&gt;
  null (modelos f)&lt;br /&gt;
&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
-- Ejercicio. Definir la función&lt;br /&gt;
--    esValida :: FNC -&amp;gt; Bool&lt;br /&gt;
-- tal que (esValida f) se verifica si f es válida. Por ejemplo, &lt;br /&gt;
--    esValida [[-1,2],[-2,1]]  ==  False&lt;br /&gt;
--    esValida [[-1,1],[-2,2]]  ==  True&lt;br /&gt;
--    esValida []               ==  True&lt;br /&gt;
-- ---------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- 1ª definición&lt;br /&gt;
esValida1 :: FNC -&amp;gt; Bool&lt;br /&gt;
esValida1 f =&lt;br /&gt;
  modelos f == interpretaciones f&lt;br /&gt;
&lt;br /&gt;
-- 2ª definición&lt;br /&gt;
esValida :: FNC -&amp;gt; Bool&lt;br /&gt;
esValida f =&lt;br /&gt;
  and [esValidaClausula c | c &amp;lt;- f]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jalonso</name></author>
	</entry>
</feed>