Acciones

Relación 10

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

-- Clausulas.hs
-- Cláusulas.
-- ---------------------------------------------------------------------

module Clausulas where

-- ---------------------------------------------------------------------
-- Librería suxiliares                                                --
-- ---------------------------------------------------------------------

import SintaxisSemantica
import FormasNormales
import Data.List

-- ---------------------------------------------------------------------
-- Cláusulas                                                          --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 1: Definir el tipo de datos Cláusula como una lista de
-- literales. 
-- ---------------------------------------------------------------------

type Cláusula = [Literal]

-- ---------------------------------------------------------------------
-- Ejercicio 2: Definir la función
--    cláusula :: Prop -> Cláusula
-- tal que (cláusula f) es la cláusula de la fórmula-clausal f. Por
-- ejemplo, 
--    cláusula p                                 ==>  [p]
--    cláusula (no p)                            ==>  [no p]
--    cláusula (((no p) \/ r) \/ ((no p) \/ q))  ==>  [q,r,no p]
-- ---------------------------------------------------------------------
--José M Contreras

clausula :: Prop -> Clausula
clausula f | literal f = [f]
clausula (Disj f g)=sort((clausula f)`union`(clausula g))



-- ---------------------------------------------------------------------
-- Ejercicio 3: Definir la función
--    cláusulasFNC :: Prop -> [Cláusula]
-- tal que (cláusulasFNC f) es el conjunto de cláusulas de la fórmula en
-- forma normal conjuntiva f. Por ejmplo,
--    cláusulasFNC (p /\ ((no q) \/ r))
--    ==> [[p],[r, no q]]
--    cláusulasFNC (((no p) \/ q) /\ ((no p) \/ (no r)))
--    ==> [[q, no p],[no p,no r]]
-- ---------------------------------------------------------------------

--José M Contreras

clausulasFNC :: Prop -> [Clausula]
clausulasFNC (Conj f g)= union (clausulasFNC f) (clausulasFNC g) 
clausulasFNC f=[clausula f]


-- ---------------------------------------------------------------------
-- Ejercicio 4: Definir la función
--    cláusulas :: Prop -> [Cláusula]
-- tal que (cláusulas f) es un conjunto de cláusulas equivalente a
-- f. Por ejemplo,
--    cláusulas (p /\ (q --> r))       
--    ==> [[p],[r,no q]]
--    cláusulas (no (p /\ (q --> r)))  
--    ==> [[q,no p],[no p,no r]]
--    cláusulas (no(p <--> r))         
--    ==> [[p,r],[p,no p],[r,no r],[no p,no r]]
-- ---------------------------------------------------------------------

--José M Contreras
 
clausulas :: Prop -> [Clausula]
clausulas = clausulasFNC . formaNormalConjuntiva

-- ---------------------------------------------------------------------
-- Cláusulas de un conjunto de fórmulas                               --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 5: Definir la función
--    cláusulasConjunto :: [Prop] -> [Cláusula]
-- tal que (cláusulasConjunto s) es un conjunto de cláusulas equivalente
-- a s. Por ejemplo,
--    cláusulasConjunto [p --> q, q --> r]   ==>  [[q,no p],[r,no q]]
--    cláusulasConjunto [p --> q, q <--> p]  ==>  [[q,no p],[p,no q]]
-- ---------------------------------------------------------------------

--Isabel Duarte
clausulasConjunto :: [Prop] -> [Cláusula]
clausulasConjunto s = unionGeneral [clausulas f | f <- s]

-- ---------------------------------------------------------------------
-- Símbolos proposicionales de una cláusula                           --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 6: Definir la función
--    símbolosProposicionalesCláusula :: Cláusula -> [Prop]
-- tal que (símbolosProposicionalesCláusula c) es el conjunto de los
-- símbolos proposicionales de c. Por ejemplo,
--    símbolosProposicionalesCláusula [p, q, no p]  ==>  [p,q]
-- ---------------------------------------------------------------------

--Isabel Duarte
simbolosProposicionalesClausula :: Clausula -> [Prop]
simbolosProposicionalesClausula = simbolosPropConj

-- ---------------------------------------------------------------------
-- Símbolos proposicionales de un conjunto de cláusulas               --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 7: Definir la función
--    símbolosProposicionalesConjuntoCláusula :: [Cláusula] -> [Prop]
-- tal que (símbolosProposicionalesConjuntoCláusula s) es el conjunto de los
-- símbolos proposicionales de s. Por ejemplo,
--    símbolosProposicionalesConjuntoCláusula [[p, q],[no q, r]]
--    ==> [p,q,r]
-- ---------------------------------------------------------------------

--Isabel Duarte
simbolosProposicionalesConjuntoClausula :: [Cláusula] -> [Prop]
simbolosProposicionalesConjuntoClausula s =
  unionGeneral [simbolosProposicionalesClausula c | c <- s]

-- ---------------------------------------------------------------------
-- Interpretaciones de una cláusula                                   --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 8: Definir la función
--    interpretacionesCláusula :: Cláusula -> [Interpretación]
-- tal que (interpretacionesCláusula c) es el conjunto de
-- interpretaciones de c. Por ejemplo,
--    interpretacionesCláusula [p, q, no p]  ==>  [[p,q],[p],[q],[]]
--    interpretacionesCláusula []            ==>  [[]]
-- ---------------------------------------------------------------------

--Isabel Duarte
interpretacionesClausula :: Cláusula -> [Interpretación]
interpretacionesClausula c = subconjuntos (simbolosProposicionalesClausula c)

-- ---------------------------------------------------------------------
-- Interpretaciones de un conjunto de cláusulas                       --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 9: Definir la función
--    interpretacionesConjuntoCláusula :: [Cláusula] -> [Interpretación]
-- tal que (interpretacionesConjuntoCláusula s) es el conjunto de
-- interpretaciones de s. Por ejemplo,
--    interpretacionesConjuntoCláusula [[p, no q],[no p, q]]
--    ==> [[p,q],[p],[q],[]]
--    interpretacionesConjuntoCláusula []
--    ==> [[]]
-- ---------------------------------------------------------------------

--Isabel Duarte
interpretacionesConjuntoClausula :: [Cláusula] -> [Interpretación]
interpretacionesConjuntoClausula c =  
  subconjuntos (simbolosProposicionalesConjuntoClausula c)

-- ---------------------------------------------------------------------
-- Modelos de cláusulas                                               --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 10: Definir la función
--    esModeloLiteral :: Interpretación -> Literal -> Bool
-- tal que (esModeloLiteral i l) se verifica si i es modelo de l. Por
-- ejemplo, 
--    esModeloLiteral [p,r] p       ==>  True
--    esModeloLiteral [p,r] q       ==>  False
--    esModeloLiteral [p,r] (no p)  ==>  False
--    esModeloLiteral [p,r] (no q)  ==>  True
-- ---------------------------------------------------------------------

--Isabel Duarte
esModeloLiteral :: Interpretacion -> Literal -> Bool
esModeloLiteral i (Atom s) = elem (Atom s) i
esModeloLiteral i (Neg (Atom s)) = notElem (Atom s) i

-- ---------------------------------------------------------------------
-- Ejercicio 11: Definir la función
--    esModeloCláusula :: Interpretación -> Cláusula -> Bool
-- tal que (esModeloCláusula i c) se verifica si i es modelo de c . Por
-- ejemplo, 
--    esModeloCláusula [p,r] [p, q]     ==>  True
--    esModeloCláusula [r] [p, no q]    ==>  True
--    esModeloCláusula [q,r] [p, no q]  ==>  False
--    esModeloCláusula [q,r] []         ==>  False
-- ---------------------------------------------------------------------

--Isabel Duarte
esModeloClausula :: Interpretacion -> Clausula -> Bool
esModeloClausula i c = or [esModeloLiteral i p | p <- c]


-- ---------------------------------------------------------------------
-- Ejercicio 12: Definir la función
--    modelosCláusula :: Cláusula -> [Interpretación]
-- tal que (modelosCláusula c) es la lista de los modelos de c. Por
-- ejemplo, 
--    modelosCláusula [no p, q]  ==>  [[p,q],[q],[]]
--    modelosCláusula [no p, p]  ==>  [[p],[]]
--    modelosCláusula []         ==>  []
-- ---------------------------------------------------------------------

--Isabel Duarte
modelosClausula :: Clausula -> [Interpretacion]
modelosClausula c = [ x | x <- (interpretacionesClausula c), esModeloClausula x c]


-- ---------------------------------------------------------------------
-- Modelos de conjuntos de cláusulas                                  --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 13: Definir la función
--    esModeloConjuntoCláusulas :: Interpretación -> [Cláusula] -> Bool
-- tal que (esModeloConjuntoCláusulas i c) se verifica si i es modelo de
-- c. Por ejemplo,
--    esModeloConjuntoCláusulas [p,r] [[p, no q], [r]]  ==>  True
--    esModeloConjuntoCláusulas [p] [[p, no q], [r]]    ==>  False
--    esModeloConjuntoCláusulas [p] []                  ==>  True
-- ---------------------------------------------------------------------

--Miriam Núñez-Romero

esModeloConjuntoClausulas :: Interpretacion -> [Clausula] -> Bool
esModeloConjuntoClausulas i s = and [esModeloClausula i c|c<-s]

-- ---------------------------------------------------------------------
-- Ejercicio 14: Definir la función
--    modelosConjuntoCláusulas :: [Cláusula] -> [Interpretación]
-- tal que (modelosConjuntoCláusulas s) es la lista de los modelos de
-- s. Por ejemplo, 
--    modelosConjuntoCláusulas [[no p, q], [no q, p]]    
--    ==> [[p,q],[]]
--    modelosConjuntoCláusulas [[no p, q], [p], [no q]]  
--    ==> []
--    modelosConjuntoCláusulas [[p, no p, q]]            
--    ==> [[p,q],[p],[q],[]]
-- ---------------------------------------------------------------------

--Miriam Núñez-Romero

modelosConjuntoClausulas :: [Clausula] -> [Interpretacion]
modelosConjuntoClausulas s = [i|i<-interpretacionesConjuntoClausula s,
                                   esModeloConjuntoClausulas i s]

-- ---------------------------------------------------------------------
-- Cláusulas válidas, satisfacibles e insatisfacibles                 --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 15: Definir la función
--    esCláusulaVálida :: Cláusula -> Bool
-- tal que (esCláusulaVálida c) se verifica si la cláusula c es
-- válida. Por ejemplo, 
--    esCláusulaVálida [p, q, no p]  ==>  True
--    esCláusulaVálida [p, q, no r]  ==>  False
--    esCláusulaVálida []            ==>  False
-- ---------------------------------------------------------------------

--Miriam Núñez-Romero

esClausulaValida :: Clausula -> Bool
esClausulaValida c = [l|l<-c,elem (complementario l) c]/=[]

-- ---------------------------------------------------------------------
-- Ejercicio 16: Definir la función
--    esCláusulaInsatisfacible :: Cláusula -> Bool
-- tal que (esCláusulaInsatisfacible c) se verifica si la cláusula c es
-- insatisfacible. Por ejemplo, 
--    esCláusulaInsatisfacible [p, q, no p]  ==>  False
--    esCláusulaInsatisfacible [p, q, no r]  ==>  False
--    esCláusulaInsatisfacible []            ==>  True
-- ---------------------------------------------------------------------

--Alejandro Ballesteros

esCláusulaInsatisfacible :: Cláusula -> Bool
esCláusulaInsatisfacible c = null c

-- ---------------------------------------------------------------------
-- Ejercicio 17: Definir la función
--    esCláusulaSatisfacible :: Cláusula -> Bool
-- tal que (esCláusulaSatisfacible c) se verifica si la cláusula c es
-- satisfacible. Por ejemplo, 
--    esCláusulaSatisfacible [p, q, no p]  ==>  True
--    esCláusulaSatisfacible [p, q, no r]  ==>  True
--    esCláusulaSatisfacible []  ==>  False
-- ---------------------------------------------------------------------

--Alejandro Ballesteros

esCláusulaSatisfacible :: Cláusula -> Bool
esCláusulaSatisfacible c = not (null c)

-- ---------------------------------------------------------------------
-- Conjuntos válidos, consistentes e inconsistentes de cláusulas      --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 18: Definir la función
--    esConjuntoVálidoDeCláusulas :: [Cláusula] -> Bool
-- tal que (esConjuntoVálidoDeCláusulas s) se verifica si el conjunto de
-- cláusulas s es válido. Por ejemplo,
--    esConjuntoVálidoDeCláusulas [[no p, q], [no q, p]]  ==>  False
--    esConjuntoVálidoDeCláusulas [[no p, p], [no q, q]]  ==>  True
--    esConjuntoVálidoDeCláusulas []                      ==>  True
-- ---------------------------------------------------------------------

--Alejandro Ballesteros

esConjuntoVálidoDeCláusulas :: [Cláusula] -> Bool
esConjuntoVálidoDeCláusulas s = and [ esClausulaValida c|c<-s]

-- ---------------------------------------------------------------------
-- Ejercicio 19: Definir la función
--    esConjuntoConsistenteDeCláusulas :: [Cláusula] -> Bool
-- tal que (esConjuntoConsistenteDeCláusulas s) se verifica si el
-- conjunto de cláusulas s es consistente. Por ejemplo,
--    esConjuntoConsistenteDeCláusulas [[no p, q], [no q, p]]  ==>  True
--    esConjuntoConsistenteDeCláusulas [[no p, p], [no q, q]]  ==>  True
--    esConjuntoConsistenteDeCláusulas []                      ==>  True
-- ---------------------------------------------------------------------

--Alejandro Ballesteros

esConjuntoConsistenteDeCláusulas :: [Cláusula] -> Bool
esConjuntoConsistenteDeCláusulas s = not( null (modeloConjuntoClausulas s))

-- ---------------------------------------------------------------------
-- Ejercicio 20: Definir la función
--    esConjuntoInconsistenteDeCláusulas :: [Cláusula] -> Bool
-- tal que (esConjuntoInconsistenteDeCláusulas s) se verifica si el
-- conjunto de cláusulas s es consistente. Por ejemplo,
--    esConjuntoInconsistenteDeCláusulas [[no p,q],[no q,p]]  ==>  False
--    esConjuntoInconsistenteDeCláusulas [[no p],[p]]         ==>  True
-- ---------------------------------------------------------------------

--Alejandro Ballesteros

esConjuntoInconsistenteDeCláusulas :: [Cláusula] -> Bool
esConjuntoInconsistenteDeCláusulas s = null (modeloConjuntoClausulas s))

-- ---------------------------------------------------------------------
-- Validez de fórmulas mediante cláusulas                             --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 21: Definir la función
--    esVálidaPorCláusulas :: Prop -> Bool
-- tal que (esVálidaPorCláusulas f) se verifica si el conjunto de
-- cláusulas de f es válido. Por ejemplo,
--    esVálidaPorCláusulas (p --> q)                 ==>  False
--    esVálidaPorCláusulas (p --> p)                 ==>  True
--    esVálidaPorCláusulas ((p --> q) \/ (q --> p))  ==>  True
-- ---------------------------------------------------------------------

esVálidaPorCláusulas :: Prop -> Bool
esVálidaPorCláusulas f = esConjuntoValidoDeClausulas (clausulas f)

-- ---------------------------------------------------------------------
-- Consecuencia mediante cláusulas                                    --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 22: Definir la función
--    esConsecuenciaEntreCláusulas :: [Cláusula] -> [Cláusula] -> Bool
-- tal que (esConsecuenciaEntreCláusulas s1 s2) se verifica si todos los
-- modelos de s1 son modelos de s2. Por ejemplo,
--    esConsecuenciaEntreCláusulas [[no p,q],[no q,r]] [[no p,r]]  
--    ==> True
--    esConsecuenciaEntreCláusulas [[p]] [[p],[q]]                 
--    ==> False
-- ---------------------------------------------------------------------
-- Pedro José Perea Rojo

esConsecuenciaEntreCláusulas :: [Cláusula] -> [Cláusula] -> Bool
esConsecuenciaEntreClausulas s1 s2 = null [k | k <- interpretacionesConjuntoClausula (s1++s2)
                                             , esModeloConjuntoClausulas k s1
                                             , not ((esModeloConjuntoClausulas k s2))]

-- ---------------------------------------------------------------------
-- Ejercicio 23: Definir la función
--    esConsecuenciaPorCláusulas1 :: [Prop] -> Prop -> Bool
-- tal que (esConsecuenciaPorCláusulas s f) se verifica si las cláusulas
-- de f son consecuencias de las de s. Por ejemplo,
--    esConsecuenciaPorCláusulas [(p --> q), (q --> r)] (p --> r)
--    ==> True
--    esConsecuenciaPorCláusulas [p] (p /\ q)
--    ==> False
-- ---------------------------------------------------------------------

--Alejandro Ballesteros

esConsecuenciaPorCláusulas :: [Prop] -> Prop -> Bool
esConsecuenciaPorCláusulas s f = esConjuntoInconsistenteDeClausulas (clausulasConjunto((Neg f):s))

--Pedro José Perea Rojo
esConsecuenciaPorClausulas2 :: [Prop] -> Prop -> Bool
esConsecuenciaPorClausulas2 s f = esConsecuenciaEntreClausulas (clausulasConjunto s) (clausulas f)