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.

哦,谢谢,我浏览定义时没有注意到区别!