破坏coq相等时的证明(不完全)无关紧要

时间:2019-02-05 22:44:55

标签: coq dependent-type

我有一个从属类型,可为过渡系统中的有限路径建模。过渡系统具有函数R,该函数产生一个命题,说明在状态ss'之间是否带有标签a。有限路径类型为:

  Inductive FinPathTail (s : S i) :=
  | FPTNil: FinPathTail s
  | FPTCons (a : Act i) (s' : S i) : R i s a s' ->
                                     FinPathTail s' -> FinPathTail s.

(“ tail”位是因为它实际上对从s开始的路径的头部以外的路径进行了建模)。

我已经为可能无限的PathTail定义了CoInductive类型(我将其粘贴在底部以便更快地解决问题),并且我有一个函数fpt_to_pt可以将FinPathTail转换为一个PathTail。这应该“显然”是内射的,所以我想证明这种形式的引理:

Lemma fpt_to_pt_inj {s : S i} (fpt fpt' : FinPathTail s)
  : (forall s s' : S i, {s = s'} + {s <> s'}) ->
    fpt_to_pt fpt = fpt_to_pt fpt' -> fpt = fpt'.

当试图通过对fpt的归纳来证明这一点时,我很快就得出了双方都是已知问题的情况。目标最终看起来像:

PTCons s a s' r (fpt_to_pt fpt) = PTCons s a2 s'2 r2 (fpt_to_pt fpt') ->
FPTCons s a s' r fpt = FPTCons s a2 s'2 r2 fpt'
我想用injection策略分解的

。结果最终像这样:

existT (fun s'0 : S i => PathTail s'0) s' (fpt_to_pt fpt) =
existT (fun s'0 : S i => PathTail s'0) s'2 (fpt_to_pt fpt') ->
s' = s'2 -> a = a2 -> FPTCons s a s' r fpt = FPTCons s a2 s'2 r2 fpt'

并使用inversion_sigma策略,可以将其转换为:

B : s' = s'2
C : a = a2
A0 : s' = s'2
A1 : eq_rect s' (fun a : S i => PathTail a) (fpt_to_pt fpt) s'2 A0 = fpt_to_pt fpt'

我想我理解为什么要使用inj_pair2_eq_dec才能对源域进行可判定性。我不明白的是:r和r2发生了什么?我知道我没有证明无关紧要的意思,但这不是意味着为了使精简相等,它们必须相等。还是我误解了一些关于命题的基本知识?

PS:这是PathTail的共同定义:

CoInductive PathTail (s : S i) :=
| PTNil: PathTail s
| PTCons (a : Act i) (s' : S i) : R i s a s' -> PathTail s' -> PathTail s.

1 个答案:

答案 0 :(得分:2)

显然,injection策略默认情况下会忽略证明之间的相等性,但是您可以使用Keep Proof Equalities flag来覆盖此行为:

Inductive foo : nat -> Prop :=
| Foo (n : nat) : foo n.

Inductive bar :=
| Bar (n : nat) : foo n -> bar.

Lemma test n nn m mm : Bar n nn = Bar m mm -> False.
Proof.
intros H. injection H. (* No equality generated. *)
Abort.

Set Keep Proof Equalities.

Lemma test n nn m mm : Bar n nn = Bar m mm -> False.
Proof.
intros H. injection H. (* Equality generated. *)
Abort.