Proof 目标函数在精益生产中的应用

Proof 目标函数在精益生产中的应用,proof,theorem-proving,lean,Proof,Theorem Proving,Lean,有一个树数据结构和一个flip方法。我想写一个证明,如果你对一棵树应用flip方法两次,你会得到初始树。我有一个目标 ⊢ flip_mytree (flip_mytree (mytree.branch t_ᾰ t_ᾰ_1 t_ᾰ_2)) = mytree.branch t_ᾰ t_ᾰ_1 t_ᾰ_2 我想替换flip\u mytree(mytree.branch t_ᾰ t_ᾰ_1吨_ᾰ_2) 带有翻转我的树的结果。我该怎么做?或者我如何将(mytree.branch a l r):=mytr

有一个树数据结构和一个
flip
方法。我想写一个证明,如果你对一棵树应用
flip
方法两次,你会得到初始树。我有一个目标

⊢ flip_mytree (flip_mytree (mytree.branch t_ᾰ t_ᾰ_1 t_ᾰ_2)) = mytree.branch t_ᾰ t_ᾰ_1 t_ᾰ_2
我想替换
flip\u mytree(mytree.branch t_ᾰ t_ᾰ_1吨_ᾰ_2) 
带有
翻转我的树的结果
。我该怎么做?或者我如何将
(mytree.branch a l r):=mytree.branch a(flip_mytree r)(flip_mytree l)
假设从
flip_mytree
函数定义拉入我的定理上下文

我读过关于
rw
apply
have
战术的文章,但它们在这里似乎没用

下面是一个完整的例子

universes u

inductive mytree (A : Type u) : Type u
| leaf : A → mytree
| branch : A → mytree → mytree → mytree

def flip_mytree {A : Type u} : mytree A → mytree A
| t@(mytree.leaf _)     := t
| (mytree.branch a l r) := mytree.branch a (flip_mytree r) (flip_mytree l)


theorem flip_flip {A : Type u} {t : mytree A} : flip_mytree (flip_mytree t) = t :=
begin
  cases t,
  

end

我认为你需要做归纳,而不是案例,这样才能起作用。 但这是可行的,只需
归纳法
rw
,如下所示

universes u

inductive mytree (A : Type u) : Type u
| leaf : A → mytree
| branch : A → mytree → mytree → mytree

def flip_mytree {A : Type u} : mytree A → mytree A
| t@(mytree.leaf _)     := t
| (mytree.branch a l r) := mytree.branch a (flip_mytree r) (flip_mytree l)


theorem flip_flip {A : Type u} {t : mytree A} : flip_mytree (flip_mytree t) = t :=
begin
  induction t with l a b₁ b₂ ih₁ ih₂,
  rw [flip_mytree],
  refl,
  
  rw [flip_mytree, flip_mytree],
  rw [ih₁, ih₂],
end

有两种不同的证明方法

定理翻转{A:Type u}:∀ {t:mytree A},flip_-mytree(flip_-mytree t)=t
|t@(mytree.leaf):=rfl
|(mytree.branch a l r):=按rw[flip_mytree,flip_mytree,flip_flip,flip_flip]
定理flip_flip'{A:Type u}{t:mytree A}:flip_mytree(flip_mytree t)=t:=
通过诱导t;simp[*,翻转我的树]

不确定你学了多少;您是否遇到过
simp
?您不仅可以传递到
rw
策略
a=b
表达式,还可以传递到函数。所以
rw flip_mytree
就是我要找的。@osseum是的,真正发生的是lean为你的函数生成了辅助方程引理。您可以通过
#print prefix flip_mytree
看到它。这些包括
flip_mytree.方程组。_eqn_1:∀ {A:typeu}(x:A),flip_mytree(mytree.leaf x)=mytree.leaf x
所以当你做
rw flip_mytree
时,这个等式就是被重写的。您甚至可以手动使用
rw[flip\u mytree.equations.\u eqn\u 1]
对第一个
rw
执行此操作,对第二个
\u eqn\u 2
执行此操作,但这只是无缘无故地添加了更多字符!