lift tactic #
This file defines the lift
tactic, allowing the user to lift elements from one type to another
under a specified condition.
Tags #
lift, tactic
@[class]
structure
can_lift
(α : Sort u_1)
(β : Sort u_2)
(coe : out_param (β → α))
(cond : out_param (α → Prop)) :
A class specifying that you can lift elements from α
to β
assuming cond
is true.
Used by the tactic lift
.
Instances of this typeclass
- has_le.le.can_lift
- pi.can_lift
- pi_subtype.can_lift
- pi_subtype.can_lift'
- subtype.can_lift
- is_unit.can_lift
- is_add_unit.can_lift
- equiv.function.bijective.can_lift
- with_bot.can_lift
- with_top.can_lift
- set.pi_set_coe.can_lift
- set.pi_set_coe.can_lift'
- set.can_lift
- function.injective.can_lift
- order_hom.monotone.can_lift
- with_one.can_lift
- with_zero.can_lift
- nat.can_lift_pnat
- int.can_lift_pnat
- rat.can_lift
- list.can_lift
- multiset.can_lift
- multiset.can_lift_finset
- finset.pi_finset_coe.can_lift
- finset.pi_finset_coe.can_lift'
- finset.finset_coe.can_lift
- finset.can_lift
- set.finite.can_lift
- finsupp.can_lift
- enat.can_lift
- part_enat.part.dom.can_lift
- cardinal.can_lift_cardinal_Type
- cardinal.can_lift_cardinal_nat
- quadratic_form.can_lift
- filter.can_lift
- nnreal.can_lift
- ennreal.can_lift
- nnreal.continuous_map.can_lift
- complex.can_lift
- topological_space.opens.is_open.can_lift
- topological_space.open_nhds_of.can_lift_set
Instances of other typeclasses for can_lift
- can_lift.has_sizeof_inst
@[protected, instance]
Equations
- pi_subtype.can_lift' ι α p = pi_subtype.can_lift ι (λ (_x : ι), α) p
@[protected, instance]
Equations
- subtype.can_lift p = {prf := _}
Lift an expression to another type.
- Usage:
'lift' expr 'to' expr ('using' expr)? ('with' id (id id?)?)?
. - If
n : ℤ
andhn : n ≥ 0
then the tacticlift n to ℕ using hn
creates a new constant of typeℕ
, also namedn
and replaces all occurrences of the old variable(n : ℤ)
with↑n
(wheren
in the new variable). It will removen
andhn
from the context.- So for example the tactic
lift n to ℕ using hn
transforms the goaln : ℤ, hn : n ≥ 0, h : P n ⊢ n = 3
ton : ℕ, h : P ↑n ⊢ ↑n = 3
(hereP
is some term of typeℤ → Prop
).
- So for example the tactic
- The argument
using hn
is optional, the tacticlift n to ℕ
does the same, but also creates a new subgoal thatn ≥ 0
(wheren
is the old variable). This subgoal will be placed at the top of the goal list.- So for example the tactic
lift n to ℕ
transforms the goaln : ℤ, h : P n ⊢ n = 3
to two goalsn : ℤ, h : P n ⊢ n ≥ 0
andn : ℕ, h : P ↑n ⊢ ↑n = 3
.
- So for example the tactic
- You can also use
lift n to ℕ using e
wheree
is any expression of typen ≥ 0
. - Use
lift n to ℕ with k
to specify the name of the new variable. - Use
lift n to ℕ with k hk
to also specify the name of the equality↑k = n
. In this case,n
will remain in the context. You can userfl
for the name ofhk
to substituten
away (i.e. the default behavior). - You can also use
lift e to ℕ with k hk
wheree
is any expression of typeℤ
. In this case, thehk
will always stay in the context, but it will be used to rewritee
in all hypotheses and the target.- So for example the tactic
lift n + 3 to ℕ using hn with k hk
transforms the goaln : ℤ, hn : n + 3 ≥ 0, h : P (n + 3) ⊢ n + 3 = 2 * n
to the goaln : ℤ, k : ℕ, hk : ↑k = n + 3, h : P ↑k ⊢ ↑k = 2 * n
.
- So for example the tactic
- The tactic
lift n to ℕ using h
will removeh
from the context. If you want to keep it, specify it again as the third argument towith
, like this:lift n to ℕ using h with n rfl h
. - More generally, this can lift an expression from
α
toβ
assuming that there is an instance ofcan_lift α β
. In this case the proof obligation is specified bycan_lift.cond
. - Given an instance
can_lift β γ
, it can also liftα → β
toα → γ
; more generally, givenβ : Π a : α, Type*
,γ : Π a : α, Type*
, and[Π a : α, can_lift (β a) (γ a)]
, it automatically generates an instancecan_lift (Π a, β a) (Π a, γ a)
.
lift
is in some sense dual to the zify
tactic. lift (z : ℤ) to ℕ
will change the type of an
integer z
(in the supertype) to ℕ
(the subtype), given a proof that z ≥ 0
;
propositions concerning z
will still be over ℤ
. zify
changes propositions about ℕ
(the
subtype) to propositions about ℤ
(the supertype), without changing the type of any variable.