我正在尝试完成6.826麻省理工学院课程的第一部分实验,但是我不确定上面提到的一项练习是否可以使用相同的证明解决很多示例。这是我的意思:
(* A `nattree` is a tree of natural numbers, where every internal
node has an associated number and leaves are empty. There are
two constructors, L (empty leaf) and I (internal node).
I's arguments are: left-subtree, number, right-subtree. *)
Inductive nattree : Set :=
| L : nattree (* Leaf *)
| I : nattree -> nat -> nattree -> nattree. (* Internal nodes *)
(* Some example nattrees. *)
Definition empty_nattree := L.
Definition singleton_nattree := I L 0 L.
Definition right_nattree := I L 0 (I L 1 (I L 2 (I L 3 L))).
Definition left_nattree := I (I (I (I L 0 L) 1 L) 2 L) 3 L.
Definition balanced_nattree := I (I L 0 (I L 1 L)) 2 (I L 3 L).
Definition unsorted_nattree := I (I L 3 (I L 1 L)) 0 (I L 2 L).
(* EXERCISE: Complete this proposition, which should be `True`
iff `x` is located somewhere in `t` (even if `t` is unsorted,
i.e., not a valid binary search tree). *)
Function btree_in (x:nat) (t:nattree) : Prop :=
match t with
| L => False
| I l n r => n = x \/ btree_in x l \/ btree_in x r
end.
(* EXERCISE: Complete these examples, which show `btree_in` works.
Hint: The same proof will work for every example.
End each example with `Qed.`. *)
Example btree_in_ex1 : ~ btree_in 0 empty_nattree.
simpl. auto.
Qed.
Example btree_in_ex2 : btree_in 0 singleton_nattree.
simpl. auto.
Qed.
Example btree_in_ex3 : btree_in 2 right_nattree.
simpl. right. auto.
Qed.
Example btree_in_ex4 : btree_in 2 left_nattree.
simpl. right. auto.
Qed.
Example btree_in_ex5 : btree_in 2 balanced_nattree.
simpl. auto.
Qed.
Example btree_in_ex6 : btree_in 2 unsorted_nattree.
simpl. auto.
Qed.
Example btree_in_ex7 : ~ btree_in 10 balanced_nattree.
simpl. intros G. destruct G. inversion H. destruct H. destruct H. inversion H.
destruct H. inversion H. destruct H. inversion H. destruct H. inversion H.
destruct H. destruct H. inversion H. destruct H. inversion H. destruct H.
Qed.
Example btree_in_ex8 : btree_in 3 unsorted_nattree.
simpl. auto.
Qed.
注释EXERCISE
下的代码已作为练习完成(尽管ex7
需要进行一些谷歌搜索...),第二个练习的提示是“提示:相同的证明适用于每个例子。”但是我不确定如何为每个非特定于此情况的人写证明。
有问题的课程材料可以在这里找到:http://6826.csail.mit.edu/2017/lab/lab0.html
作为Coq的初学者,我很乐意朝正确的方向前进,而不是仅仅得到解决方案。如果有一种特殊的策略在这里可能有用,我也许会想念它,那么指出这一点将是一件好事...
答案 0 :(得分:2)
我认为您只是错过了intuition
策略,intro
在看到A -> B
时就将其假设从~P
展开到P -> False
和{{ 1}}是,将假设中的/ \ s和/ s拆分,将目标中的/ \ s分解为多个子目标,并使用intro
搜索目标中auto
s的两个分支。看起来可能很多,但请注意,这些都是逻辑的基本策略(对\/
的调用除外)。
对每个练习进行简单操作后,您会发现它适合这种形式,然后auto
将起作用。