Juan Pablo Yamamoto
jpyamamoto[at]ciencias.unam.mx
Lógica Computacional II. Semestre 2025-1.
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE LiberalTypeSynonyms #-}
{-# LANGUAGE ImpredicativeTypes #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE MultiParamTypeClasses #-}
data Prueba (term :: k) = QED deriving Show
axioma :: Prueba p
axioma = QED
data Verdadero
data Falso
data Conjuncion p q
data Disyuncion p q
data Implicacion p q
type No p = Implicacion p Falso
type Equivalencia p q = Conjuncion (Implicacion p q) (Implicacion q p)
data Existe x p
data ParaTodo x p
type p ∧ q = Conjuncion p q
type p ∨ q = Disyuncion p q
type p → q = Implicacion p q
type p ↔ q = Equivalencia p q
infixl 5 ∨
infixl 5 ∧
infixr 4 →
infixr 3 ↔
type p ⊢ q = p -> q
infixr 2 ⊢
type p ∴ q = p -> q
infixr 1 ∴
trivial :: Prueba Verdadero
trivial = axioma
exfalso :: Prueba Falso ∴ Prueba a
exfalso _ = axioma
constructor :: (Prueba a, Prueba b) ∴ Prueba (a ∧ b)
constructor _ = axioma
first :: Prueba (a ∧ b) ∴ Prueba a
first _ = axioma
second :: Prueba (a ∧ b) ∴ Prueba b
second _ = axioma
left :: Prueba a ∴ Prueba (a ∨ b)
left _ = axioma
right :: Prueba b ∴ Prueba (a ∨ b)
right _ = axioma
cases :: (Prueba (a ∨ b), Prueba a ⊢ Prueba c, Prueba b ⊢ Prueba c) ∴ Prueba c
cases (_, _, _) = axioma
intro :: (Prueba a ⊢ Prueba b) ∴ Prueba (a → b)
intro _ = axioma
apply :: (Prueba (a → b), Prueba a) ∴ Prueba b
apply (_, _) = axioma
generalize :: (forall c. Prueba (p c)) ∴ Prueba (ParaTodo x (p x))
generalize _ = axioma
specialize :: Prueba (ParaTodo x (p x)) ∴ Prueba (p c)
specialize _ = axioma
use :: Prueba (p c) ∴ Prueba (Existe x (p x))
use _ = axioma
destruct :: (Prueba (Existe x (p x)), (forall c. Prueba (p c)) ⊢ Prueba q) ∴ Prueba q
destruct _ = axioma
class Clasicamente
absurd :: Clasicamente => (Prueba (No a) ⊢ Prueba Falso) ∴ Prueba a
absurd _ = axioma
ejemplo1 :: (Prueba a, Prueba ((b → a) → c)) ⊢ Prueba (d → c)
ejemplo1 (a, bac) = intro (\d -> apply (bac, intro (\b -> a)))
ejemplo2 :: Clasicamente => Prueba ((No (p → q)) → p)
ejemplo2 = intro (\nopq -> absurd (\nop -> apply (nopq, intro (\p -> exfalso (apply (nop, p))))))
ejemplo1 (QED, QED)
QED
Nota: Reiniciar kernel de Jupyter en este punto.
{-# LANGUAGE TypeOperators #-}
data Falso
data Verdadero = QED
type No a = a -> Falso
type a ∧ b = (a, b)
type a ∨ b = Either a b
:i Either
type a ↔ b = (a -> b) ∧ (b -> a)
ejemplo1 :: a -> ((b -> a) -> c) -> (d -> c)
ejemplo1 a bac = \d -> bac (\b -> a)
sCombinator :: (a -> b -> c) -> (a -> b) -> a -> c
sCombinator abc ab a = abc a (ab a)
contrapositiva :: (a -> b) -> No b -> No a
contrapositiva ab noB a = noB (ab a)
deMorgan1 :: No a ∧ No b -> No (a ∨ b)
deMorgan1 (noA, noB) ab = case ab of
Left a -> noA a
Right b -> noB b
dobleNegacion :: a -> No (No a)
dobleNegacion a noA = noA a
hipotesis :: a -> a
hipotesis a = a
:i id
modusPonens :: (a -> b) -> a -> b
modusPonens ab a = ab a
:i ($)
silogismoHipotetico :: (b -> c) -> (a -> b) -> a -> c
silogismoHipotetico bc ab a = bc (ab a)
:i (.)
currificacion :: ((a, b) -> c) -> a -> b -> c
currificacion abc a b = abc (a, b)
:i curry
descurrificacion :: (a -> b -> c) -> (a, b) -> c
descurrificacion abc (a, b) = abc a b
:i uncurry