[Я не уверен, что это подходит для, но здесь есть много других вопросов Coq, поэтому, возможно, кто-то может помочь.]
Я работаю через http://www.cis.upenn.edu/~bcpierce/sf/Basics.html#lab28 (чуть ниже, где вводится Case). Обратите внимание, что я начинаю начинаю и работаю дома - я не студент.
Theorem andb_true_elim1 : forall b c : bool,
andb b c = true -> b = true.
Proof.
intros b c H.
destruct b.
Case "b = true".
reflexivity.
Case "b = false".
rewrite <- H. reflexivity.
Qed.
и я смотрю, что делает переписывание:
Case := "b = false" : String.string
c : bool
H : andb false c = true
============================
false = true
тогда применяется rewrite <- H.
:
Case := "b = false" : String.string
c : bool
H : andb false c = true
============================
false = andb false c
и ясно, как доказательство будет успешным.
Я вижу, как с точки зрения манипулирования символами механическим способом я прихожу к доказательству. Это здорово. Но меня беспокоит "смысл". В частности, как я могу false = true
посередине доказательства?
Похоже, я делаю какой-то аргумент с противоречиями, но я не уверен, что. Я чувствую, что слепо слежу за правилами и каким-то образом добрался до точки, где я печатаю ерунду.
Что я делаю выше?
Я надеюсь, что вопрос будет ясен.