如何在字符串的布尔相等性上进行模式匹配并同时在 Coq 的证明中获得所需的命题相等性?
How to pattern match on a boolean equality on strings and simultaneously gain the desired propositional equality in a proof in Coq?
我在尝试证明 SF 中的 substi_correct 定理时遇到困难,因为我不知道如何拆分布尔相等性并同时将其断言为命题相等性。
Theorem substi_correct : forall s x t t',
[x:=s]t = t' <-> substi s x t t'.
Proof.
intros.
split.
+ generalize dependent t'.
induction t; intros.
- simpl in H.
subst.
case (eqb_string x0 s0).
* constructor. (*Doesn't work*)
证明目标如下,没有必要的 H : x0 = s0 这样我就可以继续了。
s : tm
x0, s0 : string
============================
substi s x0 (var s0) s
在Maps.v一章我们证明了,除了一个错误的案例,
Theorem eqb_string_true_iff : forall x y : string,
eqb_string x y = true <-> x = y.
但是在 (eqb_string x0 s0) 上进行模式匹配时如何使用 then 才能继续?我应该将其用作证明中的引理还是有更简单的方法进行?
您可以使用带有 eqn:
子句的 destruct
策略的变体来添加一个假设,记住您所处的情况:
destruct (eqb_string x0 s0) eqn:Ex0s0 (* <-- You can pick any name for the equation here *)
- (* Ex0s0 : eqb_string x0 s0 = true *)
apply eqb_string_true_iff in Ex0s0.
...
- (* Ex0s0 : eqb_string x0 s0 = false *)
apply eqb_string_false_iff in Ex0s0.
...
我在尝试证明 SF 中的 substi_correct 定理时遇到困难,因为我不知道如何拆分布尔相等性并同时将其断言为命题相等性。
Theorem substi_correct : forall s x t t',
[x:=s]t = t' <-> substi s x t t'.
Proof.
intros.
split.
+ generalize dependent t'.
induction t; intros.
- simpl in H.
subst.
case (eqb_string x0 s0).
* constructor. (*Doesn't work*)
证明目标如下,没有必要的 H : x0 = s0 这样我就可以继续了。
s : tm
x0, s0 : string
============================
substi s x0 (var s0) s
在Maps.v一章我们证明了,除了一个错误的案例,
Theorem eqb_string_true_iff : forall x y : string,
eqb_string x y = true <-> x = y.
但是在 (eqb_string x0 s0) 上进行模式匹配时如何使用 then 才能继续?我应该将其用作证明中的引理还是有更简单的方法进行?
您可以使用带有 eqn:
子句的 destruct
策略的变体来添加一个假设,记住您所处的情况:
destruct (eqb_string x0 s0) eqn:Ex0s0 (* <-- You can pick any name for the equation here *)
- (* Ex0s0 : eqb_string x0 s0 = true *)
apply eqb_string_true_iff in Ex0s0.
...
- (* Ex0s0 : eqb_string x0 s0 = false *)
apply eqb_string_false_iff in Ex0s0.
...