Zulip Chat Archive
Stream: general
Topic: Monotonic connectives
Seul Baek (Apr 04 2019 at 23:24):
I keep running into goals of the form A → B
, where A
and B
consist entirely of monotonic connectives and quantifiers (∨
, ∧
, ∀
, ∃
) and the implication A_i → B_i
holds trivially for any pair (A_i, B_i)
of corresponding subprops (e.g., h : s1 → s2 ⊢ (p ∧ q ∨ s1) → (p ∧ q ∨ s2)
). Is there a standard way to deal with this kind of goals?
Here's what I'm using right now: https://github.com/skbaek/mathlib/blob/mono_con/src/tactic/mono_con.lean It works for my needs, but I'm wondering if there is a more principled approach.
Chris Hughes (Apr 04 2019 at 23:40):
tauto
, tauto!
, or finish
Mario Carneiro (Apr 04 2019 at 23:42):
in theory mono
should do that, but I haven't checked how well it performs
Simon Hudon (Apr 04 2019 at 23:54):
confirmed: mono
solves it
Seul Baek (Apr 04 2019 at 23:59):
@Chris Hughes Oops, I meant cases in which the implications between subprops are mostly trivial, such that you want to reduce the goal into proving implications between only the non-trivial ones. For instance, if the goal was
example (α : Type) (p q : Prop) (r1 r2 s1 s2 : α → Prop) : (∀ x : α, r1 x ∧ ∃ y : α, (p ∧ q ∨ s1 y)) → (∀ x : α, r2 x ∧ ∃ y : α, (p ∧ q ∨ s2 y))
then it'd be convenient to have a tactic that reduces it to r1 x → r2 x
and s1 y → s2 y
for arbitrary x
and y
. I don't think finish
, safe
, or tauto
does it, although I may be using them incorrectly.
Seul Baek (Apr 05 2019 at 00:01):
@Simon Hudon Does it work with quantifiers? It'd solve all my problematic cases if it did
Simon Hudon (Apr 05 2019 at 00:05):
I think I have the code somewhere to make it work with quantifiers but I don't think it made it into mathlib
Simon Hudon (Apr 05 2019 at 00:07):
https://github.com/unitb/lean-lib/blob/master/src/util/meta/tactic/monotonicity/predicate.lean
Simon Hudon (Apr 05 2019 at 00:12):
If you feel like making a PR out of it, I'd love that
Seul Baek (Apr 05 2019 at 00:15):
Hmm, it looks like combining intro_mono
with mono
and adding an option for recursive application would give me what I want
Simon Hudon (Apr 05 2019 at 00:18):
Awesome :)
Jesse Michael Han (Apr 05 2019 at 02:38):
tauto!
indeed solves the first example in your file, but annoyingly you have to manually instantiate some of the universal quantifiers in the second
example (p q r s1 s2 : Prop) (h : s1 → s2) : (p ∨ q ∧ (r ∨ s1)) → (p ∨ q ∧ (r ∨ s2)) := by tauto! example (α : Type) (p1 p2 q1 q2 : Prop) (r1 r2 s1 s2 : α → Prop) (h1 : p1 → p2) (h2 : q1 → q2) (h3 : ∀ x, r1 x → r2 x) (h4 : ∀ x, s1 x → s2 x) : (∀ x : α, r1 x ∨ ∃ y : α, (p1 ∨ s1 y ∧ q1)) → (∀ x : α, r2 x ∨ ∃ y : α, (p2 ∨ s2 y ∧ q2)) := by {intros H x, specialize h3 x, specialize H x, safe; solve_by_elim}
this makes me appreciate mono
more
Last updated: Dec 20 2023 at 11:08 UTC