只需证
apply h
\.
\.
**注意:**当且仅当命题取反之前应当先满足定理条件
example {c : ℝ} (h : c ≠ 0) : Injective fun x ↦ c * x := by
intro x y h'
apply (mul_right_inj' h).mp h'
apply (mul_lt_mul_right epos).mpr
(a0 : 0 < a) : b * a < c * a ↔ b < c #epos为a0的陈述
代入得
rw[·]
nth_rw 1[·] --代入第一个
rw[\l ·]--反向代入
rw [mul_div_cancel₀]
apply h #h为rw命题成立的条件
先证明
have h : ·
取满足特定条件的变量,引入函数自变量,起的作用
intro: x y \epsilon
#epos :\epsilon > 0
#ele1 :\epsilon \leq 1
#xlt :|x| < \epsilon
**注意:**intro事实上会先按照顺序给题目条件起名,再以任取的方式引入新变量
theorem Subset.trans : r ⊆ s → s ⊆ t → r ⊆ t := by
intro rsubs ssubt x xr
exact ssubt (rsubs xr)
按定义化简(目标)
simp only[def]
#or
dsimp
#or
change def
dsimp only [Monotone] at h
rw[def]也可以展开命题的详细定义
rw[abs]可以展开成逻辑与数学语言
term proof 的表示方法
数学语言:
lean语言(Curry)
example {c : ℝ} (mf : Monotone f) (nnc : 0 ≤ c) : Monotone fun x ↦ c * f x :=
fun a b aleb ↦ mul_le_mul_of_nonneg_left (mf aleb) (nnc)
# fun 引入函数变量 在策略证明中为 intro
#\|-> 后证明过程为数学语言证明的逆过程 在策略证明中为apply的过程,可以混用
通过举例证明存在性命题
use instance
proof of the instance
#or term proof
have h: the proof of an instance:= by ...
\< instance,h\>
使用存在性命题
rcases theorem with \< variable, condition\>
#多个存在
rcases h with ⟨a ,ha⟩
rcases ha with ⟨b,hab⟩
##example
{z : ℝ} (h : ∃ x y, z = x ^ 2 + y ^ 2 ∨ z = x ^ 2 + y ^ 2 + 1) : z ≥ 0 := by
rcases h with ⟨x, y, rfl | rfl⟩ # x y为存在的量 rfl为或命题
{z : ℝ} (h : ∃ x y, z = x ^ 2 + y ^ 2 ) : z ≥ 0 := by
rcases h with ⟨x, y, rfl ⟩
# or
rintro
#or
obtain
#or in C03 S02
cases ...
#example
def FnHasLb (f : ℝ → ℝ) :=
∃ a, FnLb f a
(ubf : FnHasUb f) (ubg : FnHasUb g) : FnHasUb fun x ↦ f x + g x := by
rcases ubf with ⟨a, ubfa⟩
#变量a 对应存在性命题中‘存在’的量,ubfa为存在性命题中a应满足的条件起名
rcases ubg with ⟨b, ubgb⟩
use a + b
apply fnUb_add ubfa ubgb
#example :
FnHasUb f → FnHasUb g → FnHasUb fun x ↦ f x + g x := by
rintro ⟨a, ubfa⟩ ⟨b, ubgb⟩#按顺序引入
#example : #term proof省略关键字
FnHasUb f → FnHasUb g → FnHasUb fun x ↦ f x + g x :=
fun ⟨a, ubfa⟩ ⟨b, ubgb⟩ ↦ ⟨a + b, fnUb_add ubfa ubgb⟩
#example
(ubf : FnHasUb f) (ubg : FnHasUb g) : FnHasUb fun x ↦ f x + g x := by
obtain ⟨a, ubfa⟩ := ubf
obtain ⟨b, ubgb⟩ := ubg
exact ⟨a + b, fnUb_add ubfa ubgb⟩
更一般的 rcases
实现命题的解包
example {f : ℝ → ℝ} (h : Surjective f) : ∃ x, f x ^ 2 = 4 := by
rcases h 2 with ⟨x, hx⟩ #h 为命题名字,2为任意性参数,也可看做该命题的一个参数,\<·\>为存在性参数,可视为命题的实例化
rcases cs (ε /|c|) ecpos with ⟨N , csN⟩ #ecpos为定理要满足的条件
####
A function `f : α → β` is called surjective if every `b : β` is equal to `f a` for some `a : α`
任意性命题的解包
**xfA** : ∀ (i : I), ∃ x_1 ∈ A i, f x_1 = x
解包:rcases xfA i with ⟨yi,yAi,fyx⟩
清除分母
field_simp [h] #h为分母不为0的命题
否命题的证明:在lean中, 意味着 是错误命题
- 证明思路:
#反证
intro A(引入错误命题)
推导到一个否定的公理上
#example
(h : a < b) : ¬b < a := by
intro h'
have : a < a := lt_trans h h'
apply lt_irrefl a this
#example
(h : ∀ a, ∃ x, f x < a) : ¬FnHasLb f := by
intro fnlb
rcases fnlb with ⟨a,fnlba⟩
rcases h a with ⟨ x,hx⟩
have h1 :f x ≥ a := by apply fnlba x
linarith
#example :
¬FnHasUb fun x ↦ x :=by
intro fnub
rcases fnub with ⟨ a,fnuba⟩
have h: a+1 ≤ a:=by apply fnuba (a+1) ### fnuba中有任意性参数(任取x 有f(x)小于a, 会自动进行函数值的计算;若fnuba还有其他条件,并在该条件中已确定了自变量的选取,则不能重复声明。
linarith
正向命题的反证法
###lt_of_not_ge : ¬a ≥ b → a < b
example (h : Monotone f) (h' : f a < f b) : a < b := by
apply lt_of_not_ge #通过运用否命题,将目标转化为非
intro agtb
have h1 : f a ≥ f b:=by apply h agtb --agtb中已经包含了选取哪个自变量的信息,则不用声明自变量选取
linarith
###更一般的 by_contra
example (h : ¬∀ x, P x) : ∃ x, ¬P x := by
by_contra h' #假设原命题的否命题的正确的
apply h
intro x
show P x
by_contra h''
exact h' ⟨x, h''⟩
定义函数:
let f := fun x : ℝ ↦ (0 : ℝ)
证明False时应该如何运用apply? - Lean 定理证明是curry 化的,通过右结合的定理链条来最终推导出最后的结论; - apply运用定理后,要能直接证明结论 - 证明False链条:正命题 反命题 False
α : Type u_1
P : α → Prop
Q : Prop
h' : ∀ (x : α), P x
x : α
hx : ¬P x
⊢ False
此时证明过程如下所示
(h : ∃ x, ¬P x) : ¬∀ x, P x := by
intro h'
rcases h with ⟨ x,hx⟩
#目标为False,于是先证明反命题
apply hx
非命题的改写-用于命题叙述前面带有 的情况
push_neg at
改写逆否命题
contrapose! h
若h为条件,将h与目标转化为逆否命题形式
若h为命题,则将其转为逆否命题形式
自动矛盾寻找
contradiction
exfalso #将目前的目标替换成False
自动寻找能直接证明目标的假设
assumption
证明A ∧ B及拆解条件中的交命题
#也可用于证明充分必要性命题
constructor
\. proof of A
\. proof of B
example {x y : ℝ} : x ≤ y ∧ ¬y ≤ x ↔ x ≤ y ∧ x ≠ y :=by
#拆为充分性和必要性; constructor # 目标⊢ x ≤ y ∧ ¬y ≤ x → x ≤ y ∧ x ≠ y
· rintro ⟨h0,h1⟩ #拆分目标中的条件,此时不能用constructor拆分目标中的目标
rcases h with ⟨h₀, h₁⟩,可与存在命题解包混用,按顺序声明即可
rintro ⟨h₀, h₁⟩ h'
have ⟨h₀, h₁⟩ := h
match h with
| ⟨h₀, h₁⟩ =>
apply h.right
或命题处理
# 证明或命题
example (h : y > x ^ 2) : y > 0 ∨ y < -1 := by
left #表示选择左边
linarith [pow_two_nonneg x]
#或者
example (h : y > 0) : y > 0 ∨ y < -1 :=
Or.inl h #l表示选择左边
#运用或条件
rcases h with h1 | h2
\. h1 true
\. h2 true
cases le_or_gt 0 y #0 y 表示要代入条件的具体变量
case inl h =>
rw [abs_of_nonneg h]
intro h; left; exact h
case inr h =>
rw [abs_of_neg h]
intro h; right; exact h
#按照命题是否为真分类
example (P : Prop) : ¬¬P → P := by
intro h
by_cases h' : P
\. p is true
\. p is false
且运算的优先级高于或 自动证明的用法
linarith [le_abs_self x, le_abs_self y]:考虑到后两个命题,可使用linarith
证明函数相等
ext x #将f=g转化为证明它们在任意自变量上函数值相等,x ...表示任取的自变量
# 也可类似地运用于证明两个集合相等:\forall x \in A \in B and \forall x \in B \in A
...
其他零零碎碎的关键词1
congr:将目标中|·|=|·|转化为证明·=·
convert 直接运用定理本来的形式,而不需要与目标相关联,之后目标被拆解为证明原始目标和convert之间的关系
univ :universe 全集 用mem_univ 改写
wlog h:P不失一般性,假设P是对的
\. 证明为什么可以不是一般性
example
{a : ℝ} (h : 1 < a) : a < a * a := by
convert (mul_lt_mul_right _).2 h ##_表示占位
执行完该步骤后,证明信息为
case h.e'_3
a : ℝ
h : 1 < a
⊢ a = 1 * a
case convert_2
a : ℝ
h : 1 < a
⊢ 0 < a
#set
set A := sbSet f g with A_def
# 把A看作sbSet f g
并创建命题 A_def :A = sbSet f g
并进行替换
assumption:自动检查前面有没有假设与结论完全相同
interval_cases m <;> contradiction
--遍历m所属区间的每一个值
创造多个子情况
rvert: rintro的反面
refine' ⟨p, _, pp⟩--refine与exact相同 用-占位,留给后续补充证明,尖括号表示且
tauto
--自动处理一阶逻辑,处理与或非的关系
s.filter h 表示s中满足h的元素构成的子集集合,用mem_filter化简
记作
let N := max Na Nb
集合证明
#转化为存在,任意性语言
rw [subset_def, inter_def, inter_def]
rw [subset_def] at h
#将元素代入集合 a \in set s={x |x>1},则将 a 写为条件 a>1
simp only [mem_setOf]
# 交和并的处理
交:x ∈ s ∩ t 按定义视为两个命题:x ∈ s and x ∈ t
并:x ∈ s ∪ t 按定义视为 x ∈ s ∨ x ∈ t
差:x ∈ s ∧ x ∉ t
子集:按定义 x \in s \rightarow x\in t
不属于:x ∉ t 当作否命题处理
依照命题的与,或关系处理即可
# 若要任取元素表示集合关系
s ∩ (t ∪ u) 可以分解为:rintro x ⟨xs, xt | xu⟩
s ∩ t ∪ s ∩ u \arrow : rintro x (⟨ xs,xt ⟩ | ⟨xs,xu⟩)
\. 交用\< \>包裹,逗号隔开
\. 并无需包裹,|隔开
\. ( )表示优先级
\. 默认交的优先级高于并
#证明集合相等
ext 转化为:x ∈ s ∩ t ↔ x ∈ t ∩ s
apply Subset.antisymm 转为证明相互包含
#集合列运算
`⋃ i, A i` denotes their union, and `⋂ i, A i` denotes their intersection
simp only [mem_iInter] #定义化简,简化为逻辑语言
函数的像与原像
# apply mem_image_of_mem 转化为逻辑语言
#定义逆函数:
rw[inverse]能将其改写成逻辑语言
对于有多个原像的值,会通过choose 选择一个
对于没有原像的值,会给予一个默认值
Classical.choose_spec.{u} {α : Sort u} {p : α → Prop} (h : ∃ x, p x) : p (choose h)
###
重要替换方法:
theorem inverse_spec {f : α → β} (y : β) (h : ∃ x, f x = y) : f (inverse f y) = y
单射条件下要证明两个值相等只需证明两个对应的函数值相等
数学归纳法:
induction' n with n ih
--分成两个分支: 对于0成立;n成立时n+1成立
此时rw[fac]会用递推公式展开
==--在这一部分 自然数要被当作后继理解==
induction' n using Nat.strong_induction_on with n ih
--强数学归纳 ih此处为小于n的都成立
对于有限集合的归纳
induction' s using Finset.induction_on with a s ans ih
--归纳,先证明空集成立, 再对于一个已经正好的集合和一个新加的元素后依然成立
simp [Finset.prod_insert ans, prime_p.dvd_mul] at h₀ h₁
rw [mem_insert]
对添加新元素的连乘\包含关系进行化简
**连乘在空集中循环
其他细节
have Bpos : 0 < B :=by apply lt_of_le_of_lt (abs_nonneg _) (h₀ N₀ (le_refl _))
--用括号表示apply 的定理需要的两个参数, 在定理后加下划线表示用该定理自动推导出参数的形式
--N₀ (le_refl _)表示h₀需要的两个参数
--括号也表示了参数的优先级
change |a - b| / 2 > 0
--change 将目标替换为一个等价的表达式
处理极限过程 Filter
filter_upwards 解包