Я пытаюсь завершить первую лабораторную часть курса 6.826 MIT, но я не уверен насчет комментария над одним из упражнений, который говорит, что я могу решить кучу примеров, используя одно и то же доказательство. вот что я имею в виду:
(* 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
требовал некоторого поиска в Google ...), подсказка для второго упражнения говорит: «Подсказка: одно и то же доказательство будет работать для каждого примера». но я не уверен, как написать доказательство для каждого, которое не относится к конкретному случаю.
Материал курса, о котором идет речь, можно найти здесь: http://6826.csail.mit.edu/2017/lab/lab0.html
Как новичок в Coq, я был бы признателен за то, что меня направили в правильном направлении, а не просто дали решение. Если есть какая-то особая тактика, которая может быть полезна здесь, и я, возможно, упускаю ее, было бы хорошо указать на это ...