Я не уверен, почему вы получаете 6 подцелей: case b1; case b2; constructor
производит 4 подцела, что соответствует четырем возможным случаям для комбинаций логических значений:
true /\ true
subgoal 2 (ID 13) is:
~ (true /\ false)
subgoal 3 (ID 15) is:
~ (false /\ true)
subgoal 4 (ID 17) is:
~ (false /\ false)
Первый считается тривиальным//
.
Set Printing Coercions
скажет вам, что ваши подзадачи или фактически так:
is_true true /\ is_true true
subgoal 2 (ID 13) is:
~ (is_true true /\ is_true false)
subgoal 3 (ID 15) is:
~ (is_true false /\ is_true true)
subgoal 4 (ID 17) is:
~ (is_true false /\ is_true false)
Развертывание is_true
может помочь: case b1; case b2; constructor; rewrite /is_true.
:
true = true /\ true = true
subgoal 2 (ID 19) is:
~ (true = true /\ false = true)
subgoal 3 (ID 20) is:
~ (false = true /\ true = true)
subgoal 4 (ID 21) is:
~ (false = true /\ false = true)
3 последние подцели имеют форму (_ /\ _) -> False
(потому что ~ P
означает not P
, который разворачивается до P -> False
.
Таким образом, тактика case
, добавленная после constructor
, разрушаетглавные предположения, превращающие последние три цели в следующее:
true = true -> false = true -> False
subgoal 2 (ID 145) is:
false = true -> true = true -> False
subgoal 3 (ID 155) is:
false = true -> false = true -> False
Здесь мы имеем false = true
в качестве одного из предположений в каждой подцели, что означает, что мы получили противоречие, что SSReflect может немедленно распознать и завершитьдоказательство с использованием принципа взрыва .