应用程序定义失败,“无法将Prop与[目标]统一”

时间:2018-05-13 12:59:22

标签: coq proof

在Coq中,我使用:

显示了append对矢量的相关性
Require Import Coq.Vectors.VectorDef Omega.
Program Definition t_app_assoc v p q r (a : t v p) (b : t v q) (c : t v r) :=
  append (append a b) c = append a (append b c).
Next Obligation. omega. Qed.

我现在想在证明中应用这种相等性。以下是我期望用t_app_assoc证明的最简单的目标。当然,simpl可以证明这一点 - 这只是一个例子。

Goal (append (append (nil nat) (nil _)) (nil _)
   = append (nil _) (append (nil _) (nil _))).
apply t_app_assoc.

apply失败并显示:

  

错误:无法将“支持”与
统一   “追加(追加(nil nat)(nil nat))(nil nat)=
  追加(nil nat)(追加(nil nat)(nil nat))“。

我如何申请t_app_assoc?或者有更好的方法来定义它吗?我认为我需要Program Definition,因为仅使用Lemma会导致类型错误,因为t v (p + (q + r))t v (p + q + r)与Coq不同。

1 个答案:

答案 0 :(得分:2)

序言

我想您想要的是证明向量连接是关联的,然后将该事实用作引理。

但是您定义的t_app_assoc具有以下类型:

t_app_assoc
     : forall (v : Type) (p q r : nat), t v p -> t v q -> t v r -> Prop

您基本上想要使用:代替:=,如下所示。

From Coq Require Import Vector Arith.
Import VectorNotations.
Import EqNotations.  (* rew notation, see below *)

Section Append.

Variable A : Type.
Variable p q r : nat.
Variables (a : t A p) (b : t A q) (c : t A r).

Fail Lemma t_app_assoc :
  append (append a b) c = append a (append b c).

不幸的是,我们甚至不能使用通常的同质相等来说明这样的引理。

左侧有以下类型:

Check append (append a b) c : t A (p + q + r).

而右侧属于

类型
Check append a (append b c) : t A (p + (q + r)).

由于t A (p + q + r)t A (p + (q + r))不同,我们无法使用=来说明上述引理。

让我描述解决这个问题的一些方法:

rew符号

Lemma t_app_assoc_rew :
  append (append a b) c = rew (plus_assoc _ _ _) in
  append a (append b c).
Admitted.

这里我们只使用自然数加法的相关性定律将RHS的类型转换为t A (p + q + r)

要使其工作,之前需要Import EqNotations.

cast功能

这是一个常见问题,因此Vector库的作者决定提供具有以下类型的cast函数:

cast :
  forall (A : Type) (m : nat),
  Vector.t A m -> forall n : nat, m = n -> Vector.t A n

让我展示一下如何用它来证明向量的相关性定律。但是,让我们首先证明以下辅助引理:

Lemma uncast {X n} {v : Vector.t X n} e :
  cast v e = v.
Proof. induction v as [|??? IH]; simpl; rewrite ?IH; reflexivity. Qed.

现在我们都准备好了:

Lemma t_app_assoc_cast (a : t A p) (b : t A q) (c : t A r) :
  append (append a b) c = cast (append a (append b c)) (plus_assoc _ _ _).
Proof.
  generalize (Nat.add_assoc p q r).
  induction a as [|h p' a' IH]; intros e.
  - now rewrite uncast.
  - simpl; f_equal. apply IH.
Qed.

异构平等(a.k.a.John Major equality)

Lemma t_app_assoc_jmeq :
  append (append a b) c ~= append a (append b c).
Admitted.

End Append.

如果比较同质相等的定义

Inductive eq (A : Type) (x : A) : A -> Prop :=
  eq_refl : x = x.

和异构平等的定义

Inductive JMeq (A : Type) (x : A) : forall B : Type, B -> Prop :=
  JMeq_refl : x ~= x.

你会看到JMeq与L {和LHS>不一定是同一类型,这就是为什么t_app_assoc_jmeq的陈述看起来比以前简单一点。

载体的其他方法

参见例如this questionthis one; 我还找到了this answer 非常有用。