---
title: Praeclarum theorema
date: 2025-01-21 06:00:00 UTC+02:00
category: Proposicional
has_math: true
---
---
Demostrar con Lean4 y con Isabelle/HOL el [Praeclarum theorema](https://tinyurl.com/25yt3ef9) de Leibniz:
\\[ (p ⟶ q) ∧ (r ⟶ s) ⟶ ((p ∧ r) ⟶ (q ∧ s)) \\]
---
# Demostraciones
A continuación se muestran las [demostraciones con Lean4](#lean) y las [demostraciones con Isabelle/HOL](#isabelle).
## 1. Demostraciones con Lean4
~~~lean
import Mathlib.Tactic
variable (p q r s : Prop)
-- 1ª demostración
-- ===============
example:
(p → q) ∧ (r → s) → ((p ∧ r) → (q ∧ s)) :=
by
intro ⟨hpq, hrs⟩ ⟨hp, hr⟩
-- hpq : p → q
-- hrs : r → s
-- hp : p
-- hr : r
constructor
. -- q
exact hpq hp
. -- s
exact hrs hr
-- 2ª demostración
-- ===============
example:
(p → q) ∧ (r → s) → ((p ∧ r) → (q ∧ s)) :=
by
intro ⟨hpq, hrs⟩ ⟨hp, hr⟩
-- hpq : p → q
-- hrs : r → s
-- hp : p
-- hr : r
exact ⟨hpq hp, hrs hr⟩
-- 3ª demostración
-- ===============
example:
(p → q) ∧ (r → s) → ((p ∧ r) → (q ∧ s)) :=
fun ⟨hpq, hrs⟩ ⟨hp, hr⟩ ↦ ⟨hpq hp, hrs hr⟩
-- 4ª demostración
-- ===============
example:
(p → q) ∧ (r → s) → ((p ∧ r) → (q ∧ s)) :=
fun ⟨hpq, hrs⟩ hpr ↦ And.imp hpq hrs hpr
-- 5ª demostración
-- ===============
example:
(p → q) ∧ (r → s) → ((p ∧ r) → (q ∧ s)) :=
by aesop
~~~
## 2. Demostraciones con Isabelle/HOL
~~~isabelle
theory Praeclarum_theorema
imports Main
begin
(* 1ª demostración: detallada *)
lemma "(p ⟶ q) ∧ (r ⟶ s) ⟶ ((p ∧ r) ⟶ (q ∧ s))"
proof (rule impI)
assume "(p ⟶ q) ∧ (r ⟶ s)"
show "(p ∧ r) ⟶ (q ∧ s)"
proof (rule impI)
assume "p ∧ r"
show "q ∧ s"
proof (rule conjI)
have "p ⟶ q" using ‹(p ⟶ q) ∧ (r ⟶ s)› by (rule conjunct1)
moreover have "p" using ‹p ∧ r› by (rule conjunct1)
ultimately show "q" by (rule mp)
next
have "r ⟶ s" using ‹(p ⟶ q) ∧ (r ⟶ s)› by (rule conjunct2)
moreover have "r" using ‹p ∧ r› by (rule conjunct2)
ultimately show "s" by (rule mp)
qed
qed
qed
(* 2ª demostración: estructurada *)
lemma "(p ⟶ q) ∧ (r ⟶ s) ⟶ ((p ∧ r) ⟶ (q ∧ s))"
proof
assume "(p ⟶ q) ∧ (r ⟶ s)"
show "(p ∧ r) ⟶ (q ∧ s)"
proof
assume "p ∧ r"
show "q ∧ s"
proof
have "p ⟶ q" using ‹(p ⟶ q) ∧ (r ⟶ s)› ..
moreover have "p" using ‹p ∧ r› ..
ultimately show "q" ..
next
have "r ⟶ s" using ‹(p ⟶ q) ∧ (r ⟶ s)› ..
moreover have "r" using ‹p ∧ r› ..
ultimately show "s" ..
qed
qed
qed
(* 3ª demostración: aplicativa *)
lemma "(p ⟶ q) ∧ (r ⟶ s) ⟶ ((p ∧ r) ⟶ (q ∧ s))"
apply (rule impI)
apply (rule impI)
apply (erule conjE)+
apply (rule conjI)
apply (erule mp)
apply assumption
apply (erule mp)
apply assumption
done
(* 4ª demostración: automática *)
lemma "(p ⟶ q) ∧ (r ⟶ s) ⟶ ((p ∧ r) ⟶ (q ∧ s))"
by simp
end
~~~