From d9b5ebc7382f64a7e7ecd5d406fb6ffe13d263c2 Mon Sep 17 00:00:00 2001 From: Leonardo de Moura Date: Wed, 22 Jan 2014 09:18:40 -0800 Subject: [PATCH] refactor(builtin/kernel): cleanup Hilbert operator definition Signed-off-by: Leonardo de Moura --- src/builtin/kernel.lean | 20 ++++++++++---------- src/builtin/obj/kernel.olean | Bin 25921 -> 26580 bytes src/kernel/kernel_decls.cpp | 4 ++++ src/kernel/kernel_decls.h | 17 +++++++++++++++-- 4 files changed, 29 insertions(+), 12 deletions(-) diff --git a/src/builtin/kernel.lean b/src/builtin/kernel.lean index 88de1890b1..6af5c9be7e 100644 --- a/src/builtin/kernel.lean +++ b/src/builtin/kernel.lean @@ -45,7 +45,8 @@ definition Exists (A : TypeU) (P : A → Bool) := ¬ (∀ x, ¬ (P x)) definition nonempty (A : TypeU) := ∃ x : A, true -theorem nonempty_intro {A : TypeU} (a : A) : (nonempty A) +-- If we have an element of type A, then A is nonempty +theorem nonempty_intro {A : TypeU} (a : A) : nonempty A := assume H : (∀ x, ¬ true), (H a) theorem em (a : Bool) : a ∨ ¬ a @@ -66,11 +67,14 @@ axiom allext {A : TypeU} {B C : A → Bool} (H : ∀ x : A, B x = C x) : (∀ x -- Epsilon (Hilbert's operator) variable eps {A : TypeU} (H : nonempty A) (P : A → Bool) : A alias ε : eps -axiom eps_ax {A : TypeU} {P : A → Bool} {a : A} : P a → P (ε (nonempty_intro a) P) +axiom eps_ax {A : TypeU} (H : nonempty A) {P : A → Bool} (a : A) : P a → P (ε H P) -- Proof irrelevance axiom proof_irrel {a : Bool} (H1 H2 : a) : H1 = H2 +theorem eps_th {A : TypeU} {P : A → Bool} (a : A) : P a → P (ε (nonempty_intro a) P) +:= assume H : P a, @eps_ax A (nonempty_intro a) P a H + -- Alias for subst where we can provide P explicitly, but keep A,a,b implicit theorem substp {A : TypeU} {a b : A} (P : A → Bool) (H1 : P a) (H2 : a = b) : P b := subst H1 H2 @@ -210,16 +214,12 @@ theorem nonempty_ex_intro {A : TypeU} {P : A → Bool} (H : ∃ x, P x) : nonemp := exists_elim H (λ (w : A) (Hw : P w), exists_intro w trivial) theorem exists_to_eps {A : TypeU} {P : A → Bool} (H : ∃ x, P x) : P (ε (nonempty_ex_intro H) P) -:= exists_elim H (λ (w : A) (Hw : P w), - let Peps : P (ε (nonempty_intro w) P) := @eps_ax A P w Hw, - eqpr : (nonempty_intro w) = (nonempty_ex_intro H) := proof_irrel (nonempty_intro w) (nonempty_ex_intro H) - in subst Peps eqpr) +:= exists_elim H (λ (w : A) (Hw : P w), @eps_ax A (nonempty_ex_intro H) P w Hw) -theorem axiom_of_choice {A : TypeU} {B : TypeU} {R : A → B → Bool} (Hne : nonempty A) (H : ∀ x, ∃ y, R x y) : - ∃ f, ∀ x, R x (f x) +theorem axiom_of_choice {A : TypeU} {B : TypeU} {R : A → B → Bool} (H : ∀ x, ∃ y, R x y) : ∃ f, ∀ x, R x (f x) := exists_intro - (λ x, ε (nonempty_ex_intro (H x)) (λ y, R x y)) -- witness for f - (λ x, exists_to_eps (H x)) -- proof that witness satisfies ∀ x, R x (f x) + (λ x, ε (nonempty_ex_intro (H x)) (λ y, R x y)) -- witness for f + (λ x, exists_to_eps (H x)) -- proof that witness satisfies ∀ x, R x (f x) theorem boolext {a b : Bool} (Hab : a → b) (Hba : b → a) : a = b := or_elim (boolcomplete a) diff --git a/src/builtin/obj/kernel.olean b/src/builtin/obj/kernel.olean index 81a63524bf7c3ce1b5f6884a9f124e26c3ee4e69..c927d1ac2e9df35d53a0851ab4207695668c91b4 100644 GIT binary patch literal 26580 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℞K_l~F2A^DuNRn#!SB86U&ZFnBK`JZa{h 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