Coq/SSReflect:如何在反思时进行案例分析&;及/\
我有以下几点:Coq/SSReflect:如何在反思时进行案例分析&;及/\,coq,coq-tactic,ssreflect,Coq,Coq Tactic,Ssreflect,我有以下几点: Require Import mathcomp.ssreflect.all_ssreflect. Inductive reflect (P : Prop) (b : bool) : Prop := | ReflectT (p : P) (e : b = true) | ReflectF (np : ~ P) (e : b = false). 我试图将布尔连接与逻辑连接联系起来,下面的一行证明: Lemma andP (b1 b2 : bool) : reflect (b1
Require Import mathcomp.ssreflect.all_ssreflect.
Inductive reflect (P : Prop) (b : bool) : Prop :=
| ReflectT (p : P) (e : b = true)
| ReflectF (np : ~ P) (e : b = false).
我试图将布尔连接与逻辑连接联系起来,下面的一行证明:
Lemma andP (b1 b2 : bool) : reflect (b1 /\ b2) (b1 && b2).
Proof.
case b1; case b2; constructor =>//; by case.
Qed.
然而,我不明白最后的
;根据具体情况。
适用。当我们检查没有最后一个的证明时;按情况。
:
Lemma andP (b1 b2 : bool) : reflect (b1 /\ b2) (b1 && b2).
Proof.
case b1; case b2; constructor =>//.
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)
我们得到6个子目标(2个基本正确):
我不知道如何从这里开始,因为它们都是假的-我们如何证明?我试着做。案例。
单独进行,但这不起作用。你是如何理解的;根据具体情况是否同时承认这些子目标
谢谢。我不知道为什么你会得到6个子目标:
案例b1;案例b2;构造函数生成4个子目标,对应于布尔值组合的四种可能情况:
true /\ true
subgoal 2 (ID 13) is:
~ (true /\ false)
subgoal 3 (ID 15) is:
~ (false /\ true)
subgoal 4 (ID 17) is:
~ (false /\ false)
第一个被/
认为是微不足道的
设置打印强制
将告诉您您的子目标或实际目标如下:
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)
展开是正确的
可能会有所帮助:案例b1;案例b2;建造师;重写/是真的。
:
Lemma andP (b1 b2 : bool) : reflect (b1 /\ b2) (b1 && b2).
Proof.
case b1; case b2; constructor =>//.
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个子目标的形式为(\uu/\\uu)->False
(因为~p
代表而不是p
,它展开为p->False
)
因此,在constructor
之后添加的case
策略破坏了最重要的假设,将最后三个目标转化为以下目标:
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可以立即识别并完成使用的证明。战术的顺序合成行为近年来发生了一些变化。如今,像构造函数
这样的战术可以回溯,而执行它们的继续。因为您对反射的定义与标准定义有点不同,如果您只调用构造函数
,Coq将立即应用反射
,导致在以下三种情况下目标无法实现:
Lemma andP (b1 b2 : bool) : reflect (b1 /\ b2) (b1 && b2).
Proof.
case b1; case b2=> /=.
- constructor=> //.
- (* constructor. *) (* Stuck *)
当您使用顺序合成时,构造函数
策略回溯,正确地找到反射函数
构造函数
constructor; by try case.
- constructor; by try case.
- constructor; by try case.
Qed.
哦,谢谢,我浏览定义时没有注意到区别!