destruct them all

Jun 30, 2014 00:18

Є, значить, тут теоремка із першого розділу Software Foundations:

Theorem andb_eq_orb:
forall (b c : bool), (andb b c = orb b c) -> b = c.


В принципі, ясно, що твердження покладається на семантику операцій andb та orb, і тому доводити його треба через аналіз можливих випадків b і c. Тактику destruct в книжці уже показували, тому, здавалось би, залишилось проаналізувати випадки:

1 subgoal

============================
forall b c : bool, (b && c)%bool = (b || c)%bool -> b = c

andb_eq_orb < intros b c.
1 subgoal

b : bool
c : bool
============================
(b && c)%bool = (b || c)%bool -> b = c

andb_eq_orb < destruct b.
2 subgoals

c : bool
============================
(true && c)%bool = (true || c)%bool -> true = c

subgoal 2 is:
(false && c)%bool = (false || c)%bool -> false = c

andb_eq_orb < destruct c.
3 subgoals

============================
andb true true = orb true true -> true = true

subgoal 2 is:
andb true false = orb true false -> true = false
subgoal 3 is:
forall c : bool, andb false c = orb false c -> false = c

andb_eq_orb < reflexivity.
2 subgoals

============================
andb true false = orb true false -> true = false

subgoal 2 is:
forall c : bool, andb false c = orb false c -> false = c

andb_eq_orb < reflexivity.
Toplevel input, characters 0-11:
> reflexivity.
> ^^^^^^^^^^^
Error: Impossible to unify "false" with "true".

А от тут я перестаю розумію, чому Coq не може обчислити, що andb true false = orb true false -> true = false це правда. Здавалось би, простий reflexivity:

andb true false = orb true false -> true = false;
false = orb true false -> true = false;
false = true -> true = false;
false -> false;
true.

Підкажіть новачку, що тут не так.

P.S. simpl допоміг, цікаво, перечитаю про різницю між ним і reflexivity.
P.P.S. Довелось ще поборотись із зведенням false = true -> true = false, неочевидний трюк: intro H. rewrite H.. В результаті таки довів (хоч і почуваюсь індусом, який пише на Coq):


Proof.
destruct b.
destruct c.
simpl. reflexivity.
simpl. intro H. rewrite H. reflexivity.
destruct c.
simpl. intro H. rewrite H. reflexivity.
simpl. reflexivity.
Qed.

програмістське, coq, fp

Previous post Next post
Up