--Suma 2 numeros--
suma :: Integer -> Integer -> Integer
suma a b = a + b
--Eleva al cuadrado un número--
cuadrado :: Integer -> Integer
cuadrado a = a * a
--Regresa el último elemento de la lista--
ultimo :: [a] -> a
ultimo [x] = x
ultimo (_:xs) = ultimo xs
--Regresa el penúltimo elemento de la lista--
penultimo :: [a] -> a
penultimo [x,_] = x
penultimo (_:xs) = penultimo xs
--Regresa el i-ésimo elemento de la lista--
elementoEn :: [a] -> Integer -> a
elementoEn lista cual = elementoEnAux lista cual 1
--Auxiliar para ir contando en que posición vamos--
elementoEnAux :: [a] -> Integer -> Integer -> a
elementoEnAux (x:xs) cual i = if (cual == i) then x else elementoEnAux xs cual (i+1)
--Nos dice si el número es par o no
esPar :: Integer -> Bool
esPar i = if (mod i 2) == 0 then True else False
--Lista infinita de números pares
pares :: [Integer]
pares = [x | x <- [2..], esPar x]
--Construye una lista según--
--[f(0),f(1),f(2),...,f(n-1)]
construyeLista :: (Integer -> Integer) -> Integer -> [Integer]
construyeLista fun entero = construyeListaAux fun entero 0
--Auxiliar para ir contando en que posición vamos--
construyeListaAux :: (Integer -> Integer) -> Integer -> Integer -> [Integer]
construyeListaAux fun entero i = if (entero == i) then [] else [fun i] ++ construyeListaAux fun entero (i+1)
data Letra = A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z deriving (Show,Eq)
data Formula = Atom Letra
| Not Formula
| Formula :&: Formula
| Formula :|: Formula
| Formula :->: Formula
| Formula :<->: Formula deriving (Show,Eq)
data Booleano = Cierto | Falso deriving (Show,Eq)
-- Obtiene todas las formulas Atómicas ocupadas en la formula --
-- Ejemplo: atoms ((Atom A:&:Atom B) :->: (Atom C:|:Atom D)) --
atoms :: Formula -> [Letra]
atoms (Atom l) = [l]
atoms (Not f) = atoms f
atoms (f1 :&: f2) = (atoms f1) ++ (atoms f2)
atoms (f1 :|: f2) = (atoms f1) ++ (atoms f2)
atoms (f1 :->: f2) = (atoms f1) ++ (atoms f2)
atoms(f1 :<->: f2) = (atoms f1) ++ (atoms f2)
--Simplifica doble negación, implicación y doble implicación
-- Ejemplo: simplifica (Atom P :<->: Atom Q)
simplifica :: Formula -> Formula
simplifica (Atom l) = Atom l
simplifica (Not (Not f)) = simplifica f
simplifica (Not f) = Not (simplifica f)
simplifica (f1 :&: f2) = (simplifica f1) :&: (simplifica f2)
simplifica (f1 :|: f2) = (simplifica f1) :|: (simplifica f2)
simplifica (p :->: q) = (Not(simplifica ( p)) :|: (simplifica q))
simplifica (p :<->: q) = simplifica (((simplifica p):->:(simplifica q))
:&:
((simplifica q):->:(simplifica p)))
main = print (cuadrado 3)