Documentation
Init
.
Grind
.
Lemmas
Search
return to top
source
Imports
Init.ByCases
Init.Classical
Init.Core
Init.SimpLemmas
Init.Grind.Util
Imported by
Lean
.
Grind
.
rfl_true
Lean
.
Grind
.
intro_with_eq
Lean
.
Grind
.
and_eq_of_eq_true_left
Lean
.
Grind
.
and_eq_of_eq_true_right
Lean
.
Grind
.
and_eq_of_eq_false_left
Lean
.
Grind
.
and_eq_of_eq_false_right
Lean
.
Grind
.
eq_true_of_and_eq_true_left
Lean
.
Grind
.
eq_true_of_and_eq_true_right
Lean
.
Grind
.
or_of_and_eq_false
Lean
.
Grind
.
or_eq_of_eq_true_left
Lean
.
Grind
.
or_eq_of_eq_true_right
Lean
.
Grind
.
or_eq_of_eq_false_left
Lean
.
Grind
.
or_eq_of_eq_false_right
Lean
.
Grind
.
eq_false_of_or_eq_false_left
Lean
.
Grind
.
eq_false_of_or_eq_false_right
Lean
.
Grind
.
imp_eq_of_eq_false_left
Lean
.
Grind
.
imp_eq_of_eq_true_right
Lean
.
Grind
.
imp_eq_of_eq_true_left
Lean
.
Grind
.
eq_true_of_imp_eq_false
Lean
.
Grind
.
eq_false_of_imp_eq_false
Lean
.
Grind
.
not_eq_of_eq_true
Lean
.
Grind
.
not_eq_of_eq_false
Lean
.
Grind
.
eq_false_of_not_eq_true
Lean
.
Grind
.
eq_true_of_not_eq_false
Lean
.
Grind
.
false_of_not_eq_self
Lean
.
Grind
.
eq_eq_of_eq_true_left
Lean
.
Grind
.
eq_eq_of_eq_true_right
Lean
.
Grind
.
eq_congr
Lean
.
Grind
.
eq_congr'
Lean
.
Grind
.
ne_of_ne_of_eq_left
Lean
.
Grind
.
ne_of_ne_of_eq_right
Lean
.
Grind
.
Bool
.
and_eq_of_eq_true_left
Lean
.
Grind
.
Bool
.
and_eq_of_eq_true_right
Lean
.
Grind
.
Bool
.
and_eq_of_eq_false_left
Lean
.
Grind
.
Bool
.
and_eq_of_eq_false_right
Lean
.
Grind
.
Bool
.
eq_true_of_and_eq_true_left
Lean
.
Grind
.
Bool
.
eq_true_of_and_eq_true_right
Lean
.
Grind
.
Bool
.
or_eq_of_eq_true_left
Lean
.
Grind
.
Bool
.
or_eq_of_eq_true_right
Lean
.
Grind
.
Bool
.
or_eq_of_eq_false_left
Lean
.
Grind
.
Bool
.
or_eq_of_eq_false_right
Lean
.
Grind
.
Bool
.
eq_false_of_or_eq_false_left
Lean
.
Grind
.
Bool
.
eq_false_of_or_eq_false_right
Lean
.
Grind
.
Bool
.
not_eq_of_eq_true
Lean
.
Grind
.
Bool
.
not_eq_of_eq_false
Lean
.
Grind
.
Bool
.
eq_false_of_not_eq_true
Lean
.
Grind
.
Bool
.
eq_true_of_not_eq_false
Lean
.
Grind
.
Bool
.
false_of_not_eq_self
Lean
.
Grind
.
of_eq_eq_true
Lean
.
Grind
.
of_eq_eq_false
Lean
.
Grind
.
forall_propagator
Lean
.
Grind
.
of_forall_eq_false
Lean
.
Grind
.
dite_cond_eq_true'
Lean
.
Grind
.
dite_cond_eq_false'
Lean
.
Grind
.
eqRec_heq
Lean
.
Grind
.
eqRecOn_heq
Lean
.
Grind
.
eqNDRec_heq
Lean
.
Grind
.
of_decide_eq_true
Lean
.
Grind
.
of_decide_eq_false
Lean
.
Grind
.
decide_eq_true
Lean
.
Grind
.
decide_eq_false
source
theorem
Lean
.
Grind
.
rfl_true
:
true
=
true
source
theorem
Lean
.
Grind
.
intro_with_eq
(
p
p'
q
:
Prop
)
(
he
:
p
=
p'
)
(
h
:
p'
→
q
)
:
p
→
q
And
source
theorem
Lean
.
Grind
.
and_eq_of_eq_true_left
{
a
b
:
Prop
}
(
h
:
a
=
True
)
:
(
a
∧
b
)
=
b
source
theorem
Lean
.
Grind
.
and_eq_of_eq_true_right
{
a
b
:
Prop
}
(
h
:
b
=
True
)
:
(
a
∧
b
)
=
a
source
theorem
Lean
.
Grind
.
and_eq_of_eq_false_left
{
a
b
:
Prop
}
(
h
:
a
=
False
)
:
(
a
∧
b
)
=
False
source
theorem
Lean
.
Grind
.
and_eq_of_eq_false_right
{
a
b
:
Prop
}
(
h
:
b
=
False
)
:
(
a
∧
b
)
=
False
source
theorem
Lean
.
Grind
.
eq_true_of_and_eq_true_left
{
a
b
:
Prop
}
(
h
: (
a
∧
b
)
=
True
)
:
a
=
True
source
theorem
Lean
.
Grind
.
eq_true_of_and_eq_true_right
{
a
b
:
Prop
}
(
h
: (
a
∧
b
)
=
True
)
:
b
=
True
source
theorem
Lean
.
Grind
.
or_of_and_eq_false
{
a
b
:
Prop
}
(
h
: (
a
∧
b
)
=
False
)
:
¬
a
∨
¬
b
Or
source
theorem
Lean
.
Grind
.
or_eq_of_eq_true_left
{
a
b
:
Prop
}
(
h
:
a
=
True
)
:
(
a
∨
b
)
=
True
source
theorem
Lean
.
Grind
.
or_eq_of_eq_true_right
{
a
b
:
Prop
}
(
h
:
b
=
True
)
:
(
a
∨
b
)
=
True
source
theorem
Lean
.
Grind
.
or_eq_of_eq_false_left
{
a
b
:
Prop
}
(
h
:
a
=
False
)
:
(
a
∨
b
)
=
b
source
theorem
Lean
.
Grind
.
or_eq_of_eq_false_right
{
a
b
:
Prop
}
(
h
:
b
=
False
)
:
(
a
∨
b
)
=
a
source
theorem
Lean
.
Grind
.
eq_false_of_or_eq_false_left
{
a
b
:
Prop
}
(
h
: (
a
∨
b
)
=
False
)
:
a
=
False
source
theorem
Lean
.
Grind
.
eq_false_of_or_eq_false_right
{
a
b
:
Prop
}
(
h
: (
a
∨
b
)
=
False
)
:
b
=
False
Implies
source
theorem
Lean
.
Grind
.
imp_eq_of_eq_false_left
{
a
b
:
Prop
}
(
h
:
a
=
False
)
:
(
a
→
b
)
=
True
source
theorem
Lean
.
Grind
.
imp_eq_of_eq_true_right
{
a
b
:
Prop
}
(
h
:
b
=
True
)
:
(
a
→
b
)
=
True
source
theorem
Lean
.
Grind
.
imp_eq_of_eq_true_left
{
a
b
:
Prop
}
(
h
:
a
=
True
)
:
(
a
→
b
)
=
b
source
theorem
Lean
.
Grind
.
eq_true_of_imp_eq_false
{
a
b
:
Prop
}
(
h
:
(
a
→
b
)
=
False
)
:
a
=
True
source
theorem
Lean
.
Grind
.
eq_false_of_imp_eq_false
{
a
b
:
Prop
}
(
h
:
(
a
→
b
)
=
False
)
:
b
=
False
Not
source
theorem
Lean
.
Grind
.
not_eq_of_eq_true
{
a
:
Prop
}
(
h
:
a
=
True
)
:
(
¬
a
)
=
False
source
theorem
Lean
.
Grind
.
not_eq_of_eq_false
{
a
:
Prop
}
(
h
:
a
=
False
)
:
(
¬
a
)
=
True
source
theorem
Lean
.
Grind
.
eq_false_of_not_eq_true
{
a
:
Prop
}
(
h
: (
¬
a
)
=
True
)
:
a
=
False
source
theorem
Lean
.
Grind
.
eq_true_of_not_eq_false
{
a
:
Prop
}
(
h
: (
¬
a
)
=
False
)
:
a
=
True
source
theorem
Lean
.
Grind
.
false_of_not_eq_self
{
a
:
Prop
}
(
h
: (
¬
a
)
=
a
)
:
False
Eq
source
theorem
Lean
.
Grind
.
eq_eq_of_eq_true_left
{
a
b
:
Prop
}
(
h
:
a
=
True
)
:
(
a
=
b
)
=
b
source
theorem
Lean
.
Grind
.
eq_eq_of_eq_true_right
{
a
b
:
Prop
}
(
h
:
b
=
True
)
:
(
a
=
b
)
=
a
source
theorem
Lean
.
Grind
.
eq_congr
{
α
:
Sort
u}
{
a₁
b₁
a₂
b₂
:
α
}
(
h₁
:
a₁
=
a₂
)
(
h₂
:
b₁
=
b₂
)
:
(
a₁
=
b₁
)
=
(
a₂
=
b₂
)
source
theorem
Lean
.
Grind
.
eq_congr'
{
α
:
Sort
u}
{
a₁
b₁
a₂
b₂
:
α
}
(
h₁
:
a₁
=
b₂
)
(
h₂
:
b₁
=
a₂
)
:
(
a₁
=
b₁
)
=
(
a₂
=
b₂
)
Ne
source
theorem
Lean
.
Grind
.
ne_of_ne_of_eq_left
{
α
:
Sort
u}
{
a
b
c
:
α
}
(
h₁
:
a
=
b
)
(
h₂
:
b
≠
c
)
:
a
≠
c
source
theorem
Lean
.
Grind
.
ne_of_ne_of_eq_right
{
α
:
Sort
u}
{
a
b
c
:
α
}
(
h₁
:
a
=
c
)
(
h₂
:
b
≠
c
)
:
b
≠
a
Bool.and
source
theorem
Lean
.
Grind
.
Bool
.
and_eq_of_eq_true_left
{
a
b
:
Bool
}
(
h
:
a
=
true
)
:
(
a
&&
b
)
=
b
source
theorem
Lean
.
Grind
.
Bool
.
and_eq_of_eq_true_right
{
a
b
:
Bool
}
(
h
:
b
=
true
)
:
(
a
&&
b
)
=
a
source
theorem
Lean
.
Grind
.
Bool
.
and_eq_of_eq_false_left
{
a
b
:
Bool
}
(
h
:
a
=
false
)
:
(
a
&&
b
)
=
false
source
theorem
Lean
.
Grind
.
Bool
.
and_eq_of_eq_false_right
{
a
b
:
Bool
}
(
h
:
b
=
false
)
:
(
a
&&
b
)
=
false
source
theorem
Lean
.
Grind
.
Bool
.
eq_true_of_and_eq_true_left
{
a
b
:
Bool
}
(
h
: (
a
&&
b
)
=
true
)
:
a
=
true
source
theorem
Lean
.
Grind
.
Bool
.
eq_true_of_and_eq_true_right
{
a
b
:
Bool
}
(
h
: (
a
&&
b
)
=
true
)
:
b
=
true
Bool.or
source
theorem
Lean
.
Grind
.
Bool
.
or_eq_of_eq_true_left
{
a
b
:
Bool
}
(
h
:
a
=
true
)
:
(
a
||
b
)
=
true
source
theorem
Lean
.
Grind
.
Bool
.
or_eq_of_eq_true_right
{
a
b
:
Bool
}
(
h
:
b
=
true
)
:
(
a
||
b
)
=
true
source
theorem
Lean
.
Grind
.
Bool
.
or_eq_of_eq_false_left
{
a
b
:
Bool
}
(
h
:
a
=
false
)
:
(
a
||
b
)
=
b
source
theorem
Lean
.
Grind
.
Bool
.
or_eq_of_eq_false_right
{
a
b
:
Bool
}
(
h
:
b
=
false
)
:
(
a
||
b
)
=
a
source
theorem
Lean
.
Grind
.
Bool
.
eq_false_of_or_eq_false_left
{
a
b
:
Bool
}
(
h
: (
a
||
b
)
=
false
)
:
a
=
false
source
theorem
Lean
.
Grind
.
Bool
.
eq_false_of_or_eq_false_right
{
a
b
:
Bool
}
(
h
: (
a
||
b
)
=
false
)
:
b
=
false
Bool.not
source
theorem
Lean
.
Grind
.
Bool
.
not_eq_of_eq_true
{
a
:
Bool
}
(
h
:
a
=
true
)
:
(
!
a
)
=
false
source
theorem
Lean
.
Grind
.
Bool
.
not_eq_of_eq_false
{
a
:
Bool
}
(
h
:
a
=
false
)
:
(
!
a
)
=
true
source
theorem
Lean
.
Grind
.
Bool
.
eq_false_of_not_eq_true
{
a
:
Bool
}
(
h
: (
!
a
)
=
true
)
:
a
=
false
source
theorem
Lean
.
Grind
.
Bool
.
eq_true_of_not_eq_false
{
a
:
Bool
}
(
h
: (
!
a
)
=
false
)
:
a
=
true
source
theorem
Lean
.
Grind
.
Bool
.
false_of_not_eq_self
{
a
:
Bool
}
(
h
: (
!
a
)
=
a
)
:
False
source
theorem
Lean
.
Grind
.
of_eq_eq_true
{
a
b
:
Prop
}
(
h
: (
a
=
b
)
=
True
)
:
a
∧
b
∨
¬
a
∧
¬
b
source
theorem
Lean
.
Grind
.
of_eq_eq_false
{
a
b
:
Prop
}
(
h
: (
a
=
b
)
=
False
)
:
a
∧
¬
b
∨
¬
a
∧
b
Forall
source
theorem
Lean
.
Grind
.
forall_propagator
(
p
:
Prop
)
(
q
:
p
→
Prop
)
(
q'
:
Prop
)
(
h₁
:
p
=
True
)
(
h₂
:
q
⋯
=
q'
)
:
(∀ (
hp
:
p
),
q
hp
)
=
q'
source
theorem
Lean
.
Grind
.
of_forall_eq_false
(
α
:
Sort
u)
(
p
:
α
→
Prop
)
(
h
:
(∀ (
x
:
α
),
p
x
)
=
False
)
:
∃
(
x
:
α
)
,
¬
p
x
dite
source
theorem
Lean
.
Grind
.
dite_cond_eq_true'
{
α
:
Sort
u}
{
c
:
Prop
}
{
x✝
:
Decidable
c
}
{
a
:
c
→
α
}
{
b
:
¬
c
→
α
}
{
r
:
α
}
(
h₁
:
c
=
True
)
(
h₂
:
a
⋯
=
r
)
:
dite
c
a
b
=
r
source
theorem
Lean
.
Grind
.
dite_cond_eq_false'
{
α
:
Sort
u}
{
c
:
Prop
}
{
x✝
:
Decidable
c
}
{
a
:
c
→
α
}
{
b
:
¬
c
→
α
}
{
r
:
α
}
(
h₁
:
c
=
False
)
(
h₂
:
b
⋯
=
r
)
:
dite
c
a
b
=
r
Casts
source
theorem
Lean
.
Grind
.
eqRec_heq
{
α
:
Sort
u_2}
{
a
:
α
}
{
motive
:
(
x
:
α
) →
a
=
x
→
Sort
u_1
}
(
v
:
motive
a
⋯
)
{
b
:
α
}
(
h
:
a
=
b
)
:
HEq
(
h
▸
v
)
v
source
theorem
Lean
.
Grind
.
eqRecOn_heq
{
α
:
Sort
u_2}
{
a
:
α
}
{
motive
:
(
x
:
α
) →
a
=
x
→
Sort
u_1
}
{
b
:
α
}
(
h
:
a
=
b
)
(
v
:
motive
a
⋯
)
:
HEq
(
Eq.recOn
h
v
)
v
source
theorem
Lean
.
Grind
.
eqNDRec_heq
{
α
:
Sort
u_2}
{
a
:
α
}
{
motive
:
α
→
Sort
u_1
}
(
v
:
motive
a
)
{
b
:
α
}
(
h
:
a
=
b
)
:
HEq
(
h
▸
v
)
v
decide
source
theorem
Lean
.
Grind
.
of_decide_eq_true
{
p
:
Prop
}
{
x✝
:
Decidable
p
}
:
decide
p
=
true
→
p
=
True
source
theorem
Lean
.
Grind
.
of_decide_eq_false
{
p
:
Prop
}
{
x✝
:
Decidable
p
}
:
decide
p
=
false
→
p
=
False
source
theorem
Lean
.
Grind
.
decide_eq_true
{
p
:
Prop
}
{
x✝
:
Decidable
p
}
:
p
=
True
→
decide
p
=
true
source
theorem
Lean
.
Grind
.
decide_eq_false
{
p
:
Prop
}
{
x✝
:
Decidable
p
}
:
p
=
False
→
decide
p
=
false