我有一个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语句。任何帮助将不胜感激。
谢谢!
答案 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 == b
是string_dec a b
的精彩符号,则最好使用以下策略:
destruct (a == b) as [hyp_ab | hyp_ab].
这种行为与我上面描述的非常接近,只是更容易使用。
直观地说,当您使用 if-then-else 语句进行推理时,使用引导您的case_eq
,destruct
或case
等命令分别研究两个执行路径,记住一个假设,为什么你采取了这些执行路径。