如何在字符串的布尔相等性上进行模式匹配并同时在 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.
    ...