Coq 中的二叉树反转
Binary tree inversion in Coq
我试图证明将二叉树反转两次会产生相同的二叉树。
所以我写了下面的归纳类型:
Inductive tree : Type :=
| Leaf (x : Type)
| Node (t1 : tree) (t2 : tree).
这里是反函数:
Fixpoint invertTree (t : tree) :=
match t with
| Leaf x => Leaf x
| Node l r => Node (invertTree r) (invertTree l)
end.
定理很简单:
Theorem involution_of_invert : forall t : tree,
(invertTree (invertTree t)) = t.
基本情况很容易证明,我们从归纳证明开始,只需计算 -> 自反性。我很难理解归纳步骤。据我所知:
Proof.
induction t.
compute.
reflexivity.
induction t1, t2.
compute.
reflexivity.
我的剩余目标:
3 subgoals (ID 57)
x : Type
t2_1, t2_2 : tree
IHt1 : invertTree (invertTree (Leaf x)) = Leaf x
IHt2 : invertTree (invertTree (Node t2_1 t2_2)) = Node t2_1 t2_2
============================
invertTree (invertTree (Node (Leaf x) (Node t2_1 t2_2))) =
Node (Leaf x) (Node t2_1 t2_2)
subgoal 2 (ID 74) is:
invertTree (invertTree (Node (Node t1_1 t1_2) (Leaf x))) =
Node (Node t1_1 t1_2) (Leaf x)
subgoal 3 (ID 81) is:
invertTree (invertTree (Node (Node t1_1 t1_2) (Node t2_1 t2_2))) =
Node (Node t1_1 t1_2) (Node t2_1 t2_2)
如能提供任何提示,将不胜感激。我是 Coq 的新手(从这个问题中应该很清楚哈)。
谢谢
找到了解决方法,这里是:
Inductive tree : Type :=
| Leaf (x : Type)
| Node (t1 : tree) (t2 : tree).
Fixpoint invertTree (t : tree) :=
match t with
| Leaf x => Leaf x
| Node l r => Node (invertTree r) (invertTree l)
end.
Theorem involution_of_invert : forall t : tree,
(invertTree (invertTree t)) = t.
Proof.
induction t.
compute.
reflexivity.
simpl.
rewrite -> IHt1.
rewrite -> IHt2.
reflexivity.
Qed.
我试图证明将二叉树反转两次会产生相同的二叉树。
所以我写了下面的归纳类型:
Inductive tree : Type :=
| Leaf (x : Type)
| Node (t1 : tree) (t2 : tree).
这里是反函数:
Fixpoint invertTree (t : tree) :=
match t with
| Leaf x => Leaf x
| Node l r => Node (invertTree r) (invertTree l)
end.
定理很简单:
Theorem involution_of_invert : forall t : tree,
(invertTree (invertTree t)) = t.
基本情况很容易证明,我们从归纳证明开始,只需计算 -> 自反性。我很难理解归纳步骤。据我所知:
Proof.
induction t.
compute.
reflexivity.
induction t1, t2.
compute.
reflexivity.
我的剩余目标:
3 subgoals (ID 57)
x : Type
t2_1, t2_2 : tree
IHt1 : invertTree (invertTree (Leaf x)) = Leaf x
IHt2 : invertTree (invertTree (Node t2_1 t2_2)) = Node t2_1 t2_2
============================
invertTree (invertTree (Node (Leaf x) (Node t2_1 t2_2))) =
Node (Leaf x) (Node t2_1 t2_2)
subgoal 2 (ID 74) is:
invertTree (invertTree (Node (Node t1_1 t1_2) (Leaf x))) =
Node (Node t1_1 t1_2) (Leaf x)
subgoal 3 (ID 81) is:
invertTree (invertTree (Node (Node t1_1 t1_2) (Node t2_1 t2_2))) =
Node (Node t1_1 t1_2) (Node t2_1 t2_2)
如能提供任何提示,将不胜感激。我是 Coq 的新手(从这个问题中应该很清楚哈)。
谢谢
找到了解决方法,这里是:
Inductive tree : Type :=
| Leaf (x : Type)
| Node (t1 : tree) (t2 : tree).
Fixpoint invertTree (t : tree) :=
match t with
| Leaf x => Leaf x
| Node l r => Node (invertTree r) (invertTree l)
end.
Theorem involution_of_invert : forall t : tree,
(invertTree (invertTree t)) = t.
Proof.
induction t.
compute.
reflexivity.
simpl.
rewrite -> IHt1.
rewrite -> IHt2.
reflexivity.
Qed.