Coq:如何证明包含字符串的if语句?

Coq:如何证明包含字符串的if语句?,coq,coq-tactic,Coq,Coq Tactic,我有一个字符串a,与字符串b比较,如果equals有一个字符串c,否则有字符串x。我知道在假设中,funx如果你能写一个If-then-else语句,这意味着测试表达式a==b是一个有两个构造函数的类型(比如bool)或者(sumbool)。我首先假设类型是bool。在这种情况下,验证过程中的最佳方法是输入以下命令 case_eq (a == b); intros hyp_ab. 这将产生两个目标。在第一个例子中,你会有一个假设 hyp_ab : a == b = true 它断言测试成功,

我有一个
字符串a
,与
字符串b
比较,如果equals有一个
字符串c
,否则有
字符串x
。我知道在假设中,
funx如果你能写一个If-then-else语句,这意味着测试表达式
a==b
是一个有两个构造函数的类型(比如
bool
)或者(
sumbool
)。我首先假设类型是
bool
。在这种情况下,验证过程中的最佳方法是输入以下命令

case_eq (a == b); intros hyp_ab.
这将产生两个目标。在第一个例子中,你会有一个假设

hyp_ab : a == b = true
它断言测试成功,并且目标结论具有以下形状(if-then-else被then分支替换):


fun c让我补充Yves的答案,指出一个通用的“视图”模式,如果需要案例分析,它在许多情况下都能很好地工作。我将在math comp中使用内置的支持,但该技术并不特定于此

让我们假设您的初始目标:

From mathcomp Require Import all_ssreflect.

Variables (T : eqType) (a b : T).
Lemma u : (if a == b then 0 else 1) = 2.
Proof.
现在,您可以使用
case\u eq
+
siml
进入下一步;但是,您也可以使用更专门的“视图”引理进行匹配。例如,您可以使用
ifP

ifP : forall (A : Type) (b : bool) (vT vF : A),
      if_spec b vT vF (b = false) b (if b then vT else vF)
其中
如果规范
为:

Inductive if_spec (A : Type) (b : bool) (vT vF : A) (not_b : Prop) : bool -> A -> Set :=
    IfSpecTrue : b -> if_spec b vT vF not_b true vT
  | IfSpecFalse : not_b -> if_spec b vT vF not_b false vF
这看起来有点混乱,重要的一点是类型族的参数
bool->a->Set
。第一个练习是“证明
ifP
引理!”

事实上,如果我们在证明中使用
ifP
,我们得到:

case: ifP.
Goal 1: (a == b) = true  -> 0 = 2
Goal 2: (a == b) = false -> 1 = 2
请注意,我们不必指定任何内容!事实上,
{A形式的引理
}+{B}
只是这种视图模式的特例。这个技巧在许多其他情况下都有效,例如,您也可以使用
eqP
,它有一个规范,将布尔等式与命题等式联系起来。如果您这样做:

case: eqP.
您将获得:

Goal 1: a = b  -> 0 = 2
Goal 2: a <> b -> 1 = 2
目标1:a=b->0=2
目标2:AB->1=2

这很方便。事实上,
eqP
基本上是
type\u dec
原则的通用版本。

你的问题很难理解。什么是arith?它来自哪里?在英文文本中,您写道c和x具有不同的类型,但要使if-then-else语句类型正确,它们必须具有相同的类型。@Yves:编辑了问题。我只是想让我的问题保持简单,不要有太多的定义。我仍然不知道符号“a==b”是从哪里来的。Coq的字符串库中似乎没有引入这种表示法。另一方面,该库具有sting_dec功能。这是您使用的吗?当您提出问题时,请发布独立的(包括相关的导入)有效代码。这甚至不需要解析,也不会增加任何复杂性,恰恰相反。举个例子:你必须回答另外两个问题来澄清你想知道的是什么。非常感谢。我一直在寻找
case\u eq
。非常感谢您的详细解释。:)“视图”这个名称从何而来?人们对视图的一般直觉是什么?我的意思是,它们不是重写方程或反演引理。我不确定“视图”这个名字从何而来,可能有更好的名字,也许是“规范”。我将其称为某些运营商的视图(即
Inductive if_spec (A : Type) (b : bool) (vT vF : A) (not_b : Prop) : bool -> A -> Set :=
    IfSpecTrue : b -> if_spec b vT vF not_b true vT
  | IfSpecFalse : not_b -> if_spec b vT vF not_b false vF
case: ifP.
Goal 1: (a == b) = true  -> 0 = 2
Goal 2: (a == b) = false -> 1 = 2
case: eqP.
Goal 1: a = b  -> 0 = 2
Goal 2: a <> b -> 1 = 2