Coq:如何证明涉及字符串的语句?

时间:2017-09-26 19:37:51

标签: coq coq-tactic

我有一个string a并与string b进行比较,如果等于string c,则其他为string x。我在假设fun x <= fun c中知道。我如何证明以下陈述? fun是一个接受string并返回nat的函数。

fun (if a == b then c else x) <= S (fun c)

逻辑似乎很明显,但我无法在coq中拆分if语句。任何帮助将不胜感激。

谢谢!

2 个答案:

答案 0 :(得分:3)

让我补充Yves回答指出一般概念&#34;&#34;在许多情况下效果很好的模式需要进行案例分析。我将使用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_eq + simpl进入下一步;但是,您也可以使用更专业的&#34;视图&#34;引理。例如,您可以使用ifP

ifP : forall (A : Type) (b : bool) (vT vF : A),
      if_spec b vT vF (b = false) b (if b then vT else vF)

其中if_spec是:

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的参数。第一个练习是&#34;证明ifP引理!&#34;。

的确,如果我们在证明中使用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

非常方便。实际上,eqP基本上是type_dec原则的通用版本。

答案 1 :(得分:1)

如果您可以编写if-then-else语句,则表示测试表达式a == b属于具有两个构造函数(如bool)或(sumbool)的类型。我将首先假设类型为bool。在这种情况下,证明期间的最佳方法是输入以下命令。

case_eq (a == b); intros hyp_ab.

这将产生两个目标。在第一个中,您将有一个假设

hyp_ab : a == b = true

断言测试成功并且目标结论具有以下形状( if-then-else then 分支替换):

有趣的c&lt; = S(有趣的c)

在第二个目标中,您将有一个假设

hyp_ab : a == b = false

并且目标结论具有以下形状( if-then-else else 分支替换)。

fun x <= S (fun c)

你应该可以从那里继续。

另一方面,Coq的String库有一个函数string_dec,其返回类型为{a = b}+{a <> b}。如果您的符号a == bstring_dec a b的精彩符号,则最好使用以下策略:

destruct (a == b) as [hyp_ab | hyp_ab].

这种行为与我上面描述的非常接近,只是更容易使用。

直观地说,当您使用 if-then-else 语句进行推理时,使用引导您的case_eqdestructcase等命令分别研究两个执行路径,记住一个假设,为什么你采取了这些执行路径。