Zulip Chat Archive
Stream: general
Topic: help proving antisymm
Bernd Losert (Dec 12 2021 at 21:17):
I have the following code:
import tactic
import order.filter.ultrafilter
import order.filter.partial
variable a : Type*
class convergence_space (a : Type*) :=
(conv : filter a -> a -> Prop)
open convergence_space
namespace convergence_space
instance : has_le (convergence_space a) := {
le := fun p q, forall {l : filter a} {x : a}, @conv a q l x -> @conv a p l x
}
theorem conv_le_antisymm : forall (p q : convergence_space a), p <= q -> q <= p -> p = q := begin
intros p q h h',
ext l x,
exact iff.intro (h l x, h' l x),
end
Unfortunately, lean complains with:
error: no applicable extensionality rule found for convergence_space
I think I need to unfold the definitions of h and h', but I'm not sure how to do so.
Heather Macbeth (Dec 12 2021 at 21:30):
If you tag the structure with @[ext], it should auto-generate the ext lemmas.
@[ext] structure convergence_space (a : Type*) :=
(conv : filter a → a → Prop)
#check convergence_space.ext
#check convergence_space.ext_iff
Bernd Losert (Dec 12 2021 at 21:36):
Ah, nice. Didn't know about that attribute. I added it, but now I get a type mismatch error in conv_le_antisymm.
Heather Macbeth (Dec 12 2021 at 22:06):
@Bernd Losert Your syntax is a bit off with iff.intro.
theorem conv_le_antisymm : forall (p q : convergence_space a), p <= q -> q <= p -> p = q := begin
intros p q h h',
ext l x,
exact iff.intro h' h,
end
Bernd Losert (Dec 12 2021 at 22:13):
Ah, that works. I was confused because in another thread I asked about how to use ext and there it was like this:
theorem foo : ∀ (p q : a -> a -> Prop), (∀ x y, p x y -> q x y) → (∀ x y, q x y -> p x y) → p = q :=
begin
intros p q hpq hqp,
ext x y,
exact ⟨hpq x y, hqp x y⟩,
end
Heather Macbeth (Dec 12 2021 at 22:19):
@Bernd Losert By the way, instead of proving some antisymmetry lemma directly, you probably want to put a partial order structure on convergence_space a, and then it will be accessible as docs#le_antisymm, while also hooking your result in to all the other lemmas about partial orders.
instance : partial_order (convergence_space a) :=
{ le_refl := _,
le_trans := _,
le_antisymm := λ p q h h', by { ext, exact iff.intro h' h },
.. convergence_space.has_le a }
Bernd Losert (Dec 12 2021 at 22:21):
Actually, that's what I'm doing. I just wrote it out as a lemma to demonstrate my issue.
Bernd Losert (Dec 12 2021 at 22:22):
When I use your suggested instance, I get this error:
function expected at
convergence_space.has_le
term has type
has_le (convergence_space ?m_1)
Bernd Losert (Dec 12 2021 at 22:24):
Ah, it's because of a in has_le a.
Yakov Pechersky (Dec 12 2021 at 22:24):
Bernd, iff is an inductive type that produces a Prop. It has one single constructor, iff.intro. So either you say iff.intro h' h, or you say ⟨h', h⟩ because those chevrons are constructor notation (when used in this location). Whether or not you include l and x depends on the type of argument you made them be. In your definition on le you made them implicit, which is why you only need h' and h.
Bernd Losert (Dec 12 2021 at 22:26):
Makes sense.
Last updated: May 02 2025 at 03:31 UTC