lean2/examples/lean/set.lean
Leonardo de Moura d7886c4f5f doc(examples/lean): new example
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2013-12-18 21:03:16 -08:00

30 lines
1.1 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Definition set (A : Type) : Type := A -> Bool
Definition element {A : Type} (x : A) (s : set A) := s x
Infix 60 ∈ : element
Definition subset {A : Type} (s1 : set A) (s2 : set A) := ∀ x, x ∈ s1 ⇒ x ∈ s2
Infix 50 ⊆ : subset
Theorem SubsetProp {A : Type} {s1 s2 : set A} {x : A} (H1 : s1 ⊆ s2) (H2 : x ∈ s1) : x ∈ s2 :=
MP (ForallElim H1 x) H2
Theorem SubsetTrans {A : Type} {s1 s2 s3 : set A} (H1 : s1 ⊆ s2) (H2 : s2 ⊆ s3) : s1 ⊆ s3 :=
ForallIntro (λ x,
Discharge (λ Hin : x ∈ s1,
let L1 : x ∈ s2 := SubsetProp H1 Hin,
L2 : x ∈ s3 := SubsetProp H2 L1
in L2)).
Definition transitive {A : Type} (R : A → A → Bool) := ∀ x y z, R x y ⇒ R y z ⇒ R x z
Theorem SubsetTrans2 {A : Type} : transitive (subset::explicit A) :=
ForallIntro (λ s1, ForallIntro (λ s2, ForallIntro (λ s3,
Discharge (λ H1, (Discharge (λ H2,
SubsetTrans H1 H2)))))).
Theorem SubsetRefl {A : Type} (s : set A) : s ⊆ s :=
ForallIntro (λ x, Discharge (λ H : x ∈ s, H))
Definition union {A : Type} (s1 : set A) (s2 : set A) := λ x, x ∈ s1 x ∈ s2
Infix 55 : union