Acciones

Diferencia entre revisiones de «Relación 11»

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

 
(No se muestran 4 ediciones intermedias de 3 usuarios)
Línea 32: Línea 32:
 
--La función complementario se define en el fichero importado FormasNormales  
 
--La función complementario se define en el fichero importado FormasNormales  
  
 +
--Miriam Núñez-Romero
 +
 +
resolvente2 :: Clausula -> Clausula -> Literal -> Clausula
 +
resolvente2 c1 c2 l = delete l (delete (complementario l) (c1`union`c2))
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
 
-- Ejercicio 2: Definir la función
 
-- Ejercicio 2: Definir la función
Línea 75: Línea 79:
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
  
esTautología :: Cláusula -> Bool
+
--Jose M Contreras
esTautología c = undefined
+
 
 +
esTautologia :: Clausula -> Bool
 +
esTautologia c = or[elem (complementario x) (delete x c)|x<-c]
 +
 
 +
--Miriam Núñez-Romero
 +
esTautologia2 :: Clausula -> Bool
 +
esTautologia2 c = or [elem (complementario x) c |x<-c]
  
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
Línea 86: Línea 96:
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
  
eliminaTautologías :: [Cláusula] -> [Cláusula]
+
--Jose M Contreras
eliminaTautologías s = undefined
+
 +
eliminaTautologias :: [Clausula] -> [Clausula]
 +
eliminaTautologias s = [x|x<-s, not(esTautologia x)]
  
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
Línea 109: Línea 121:
  
 
esInconsistentePorResolución :: [Cláusula] -> Bool
 
esInconsistentePorResolución :: [Cláusula] -> Bool
esInconsistentePorResolución s = undefined
+
esInconsistentePorResolución s =
 +
    esInconsistentePorResolución' s []
 +
 
 +
esInconsistentePorResolución' :: [Cláusula] -> [Cláusula] -> Bool
 +
esInconsistentePorResolución' soporte usables
 +
    | null soporte    = False
 +
    | elem [] soporte = True
 +
    | otherwise      =
 +
        esInconsistentePorResolución' soporte' usables'
 +
        where actual  = head soporte
 +
              usables' = union [actual] usables
 +
              soporte' = union (tail soporte)
 +
                              [c
 +
                                | c <- resolventesCláusulaConjunto
 +
                                      actual
 +
                                      usables'
 +
                                , not (esTautología c)
 +
                                , notElem c soporte
 +
                                , notElem c usables']
 +
 
  
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
Línea 126: Línea 157:
  
 
esVálidaPorResolución :: Prop -> Bool
 
esVálidaPorResolución :: Prop -> Bool
esVálidaPorResolución f = undefined
+
esVálidaPorResolución f =  
 +
  esInconsistentePorResolucion (eliminaTautologias (clausulas (Neg f)))
  
 
-- ---------------------------------------------------------------------
 
-- ---------------------------------------------------------------------
Línea 144: Línea 176:
  
 
esConsecuenciaPorResolución :: [Prop] -> Prop -> Bool
 
esConsecuenciaPorResolución :: [Prop] -> Prop -> Bool
esConsecuenciaPorResolución s f = undefined
+
esConsecuenciaPorResolución s f =  
 +
  esInconsistentePorResolucion (eliminaTautologias (clausulasConjunto ((Neg f):s)))
 +
 
  
  
 
</source>
 
</source>

Revisión actual del 20:57 22 may 2013

-- ResolucionProposicional.hs
-- Resolución proposicional.
-- ---------------------------------------------------------------------

module ResolucionProposicional where

import SintaxisSemantica
import FormasNormales
import Clausulas
import Data.List

-- ---------------------------------------------------------------------
-- Resolventes                                                        --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 1: Definir la función
--    resolvente :: Cláusula -> Cláusula -> Literal -> Cláusula
-- tal que (resolvente c1 c2 l) es la resolvente de c1 y c2 respecto del
-- literal l. Por ejemplo,
--    resolvente [no p,q] [no q,r] q  ==>  [no p,r]
--    resolvente [no p,no q] [q,r] (no q)  ==>  [no p,r]
--    resolvente [no p,q] [no p,no q] q  ==>  [no p]
-- ---------------------------------------------------------------------

--Jose M Contreras

resolvente :: Clausula -> Clausula -> Literal -> Clausula
resolvente c1 c2 x = union (delete x c1) (delete (complementario x) c2)
--La función complementario se define en el fichero importado FormasNormales 

--Miriam Núñez-Romero

resolvente2 :: Clausula -> Clausula -> Literal -> Clausula
resolvente2 c1 c2 l = delete l (delete (complementario l) (c1`union`c2))
-- ---------------------------------------------------------------------
-- Ejercicio 2: Definir la función
--    resolventes :: Cláusula -> Cláusula -> [Cláusula]
-- tal que (resolventes c1 c2) es el conjunto de las resolventes de c1 y
-- c2. Por ejemplo,
--    resolventes [no p,q] [p,no q]  ==>  [[q,no q],[no p,p]]
--    resolventes [no p,q] [p,q]     ==>  [[q]]
-- ---------------------------------------------------------------------

--Jose M Contreras

resolventes :: Clausula -> Clausula -> [Clausula]
resolventes c1 c2 = [resolvente c1 c2 x| x<-c1, elem (complementario x) c2]
 

-- ---------------------------------------------------------------------
-- Ejercicio 3: Definir la función
--    resolventesCláusulaConjunto :: Cláusula -> [Cláusula] -> [Cláusula]
-- tal que (resolventes c s) es el conjunto de las resolventes de c y
-- s. Por ejemplo, 
--    resolventesCláusulaConjunto [no p,q] [[p,q],[p,r],[no q,s]]
--    ==> [[q],[q,r],[no p,s]]
-- ---------------------------------------------------------------------

--Jose M Contreras

resolventesClausulaConjunto :: Clausula -> [Clausula] -> [Clausula]
resolventesClausulaConjunto c s = unionGeneral [resolventes c x|x<-s]

-- ---------------------------------------------------------------------
-- Eliminación de tautologías                                         --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 1: Definir la función
--    esTautología :: Cláusula -> Bool
-- tal que (esTautología c) se verifica si c es una tautología. Por
-- ejemplo, 
--    esTautología [p, q, no p]  ==>  True
--    esTautología [p, q, no r]  ==>  False
--    esTautología []            ==>  False
-- ---------------------------------------------------------------------

--Jose M Contreras

esTautologia :: Clausula -> Bool
esTautologia c = or[elem (complementario x) (delete x c)|x<-c]

--Miriam Núñez-Romero
esTautologia2 :: Clausula -> Bool
esTautologia2 c = or [elem (complementario x) c |x<-c]

-- ---------------------------------------------------------------------
-- Ejercicio 2: Definir la función
--    eliminaTautologías :: [Cláusula] -> [Cláusula]
-- tal que (eliminaTautologías s) es el conjunto obtenido eliminando las
-- tautologías de s. Por ejemplo,
--    eliminaTautologías [[p, q], [p, q, no p]]  ==>  [[p,q]]
-- ---------------------------------------------------------------------

--Jose M Contreras
 
eliminaTautologias :: [Clausula] -> [Clausula]
eliminaTautologias s = [x|x<-s, not(esTautologia x)]

-- ---------------------------------------------------------------------
-- Decisión de inconsistencia por resolución                          --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 4: Definir la función
--    esInconsistentePorResolución :: [Cláusula] -> Bool
-- tal que (esInconsistentePorResolución s) se verifica si s es
-- inconsistente mediante resolución. Por ejemplo,
--    esInconsistentePorResolución [[p],[no p,q],[no q]]
--    ==> True
--    esInconsistentePorResolución [[p],[no p,q]]
--    ==> False
--    esInconsistentePorResolución [[p,q],[no p,q],[p,no q],[no p,no q]]
--    ==> True
--    esInconsistentePorResolución [[p,q],[p,r],[no q,no r],[no p]]
--    ==> True
-- ---------------------------------------------------------------------

esInconsistentePorResolución :: [Cláusula] -> Bool
esInconsistentePorResolución s =
    esInconsistentePorResolución' s []

esInconsistentePorResolución' :: [Cláusula] -> [Cláusula] -> Bool
esInconsistentePorResolución' soporte usables 
    | null soporte    = False
    | elem [] soporte = True
    | otherwise       =
        esInconsistentePorResolución' soporte' usables'
        where actual   = head soporte
              usables' = union [actual] usables
              soporte' = union (tail soporte)
                               [c 
                                | c <- resolventesCláusulaConjunto
                                       actual 
                                       usables'
                                , not (esTautología c)
                                , notElem c soporte
                                , notElem c usables']


-- ---------------------------------------------------------------------
-- Validez mediante resolución                                        --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 5: Definir la función
--    esVálidaPorResolución :: Prop -> Bool
-- tal que (esVálidaPorResolución f) se verifica si f es válida por
-- resolución. Por ejemplo, 
--    esVálidaPorResolución (p --> p)                 ==>  True
--    esVálidaPorResolución ((p --> q) \/ (q --> p))  ==>  True
--    esVálidaPorResolución (p --> q)                 ==>  False
-- ---------------------------------------------------------------------

esVálidaPorResolución :: Prop -> Bool
esVálidaPorResolución f = 
   esInconsistentePorResolucion (eliminaTautologias (clausulas (Neg f)))

-- ---------------------------------------------------------------------
-- Consecuencia mediante resolución                                   --
-- ---------------------------------------------------------------------

-- ---------------------------------------------------------------------
-- Ejercicio 6: Definir la función
--    esConsecuenciaPorResolución :: [Prop] -> Prop -> Bool
-- tal que (esConsecuenciaPorResolución s f) se verifica si f es
-- consecuencia de s mediante el método de resolución. Por ejemplo,
--    esConsecuenciaPorResolución [p --> q, q --> r] (p --> r)  
--    ==> True
--    esConsecuenciaPorResolución [p --> q, q --> r] (p <--> r)
--    ==> False
-- ---------------------------------------------------------------------

esConsecuenciaPorResolución :: [Prop] -> Prop -> Bool
esConsecuenciaPorResolución s f = 
   esInconsistentePorResolucion (eliminaTautologias (clausulasConjunto ((Neg f):s)))