在 Coq 中如何表达归纳关系的一个元素不能从另一个元素推导出来?

How to express that one element of an inductive relation can't be derived from another in Coq?

这与简单暗示略有不同,如这个玩具示例所示。

Inductive R : nat -> nat -> Prop :=
  | Base1: R 0 1
  | Base2: R 0 2
  | Ind: forall n m,
    R n m -> R (n+1) (m+1).

根据这个定义,我们有三个可证明的陈述:R 2 3R 3 5(R 2 3) -> (R 3 5)。我正在寻找的是某种表达以下内容的方法:“不存在从 R 2 3 开始并在 R 3 5 结束的推导路径(即一系列归纳构造函数应用程序)。

有没有办法在 Coq 中做到这一点?

这里是关于如何定义派生路径的建议。我不知道这是最好的方法,但这是我想出的方法。

Require Import List Lia.
Import ListNotations.

Inductive evidence :=
  | B1 : evidence
  | B2 : evidence
  | Step : nat -> nat -> evidence.

Inductive R : nat -> nat -> list evidence -> Prop :=
  | Base1 : R 0 1 [B1]
  | Base2 : R 0 2 [B2]
  | Ind : forall n m es, R n m es -> R (n+1) (m+1) (Step n m :: es).


Lemma R_B2 (n : nat) (es : list evidence) : R n (n + 2) es -> In B2 es.
Proof.
  generalize dependent n.
  induction es as [|e es' IHes'].
  - now intros Rnn2nil; inversion Rnn2nil.
  - intros n Rnn2.
    case es' as [| e' es''].
    + inversion Rnn2.
      * now left.
      * now inversion H2.
    + inversion Rnn2.
      right.
      apply (IHes' n0).
      now replace (n0 + 2) with m by lia.
Qed.

你可以简化这个证明,如果你愿意,可以避免lia