【问题标题】:Implementing vector addition in Coq在 Coq 中实现向量加法
【发布时间】:2015-02-12 20:28:50
【问题描述】:

在一些依赖类型语言(例如 Idris)中实现向量加法相当简单。根据example on Wikipedia

import Data.Vect

%default total

pairAdd : Num a => Vect n a -> Vect n a -> Vect n a
pairAdd Nil       Nil       = Nil
pairAdd (x :: xs) (y :: ys) = x + y :: pairAdd xs ys

(请注意 Idris 的整体检查器如何自动推断添加 Nil 和非 Nil 向量在逻辑上是不可能的。)

我正在尝试在 Coq 中实现等效功能,使用自定义向量实现,尽管与官方 Coq libraries 中提供的非常相似:

Set Implicit Arguments.

Inductive vector (X : Type) : nat -> Type :=
  | vnul : vector X 0 
  | vcons {n : nat} (h : X) (v : vector X n) : vector X (S n).
   Arguments vnul [X].

Fixpoint vpadd {n : nat} (v1 v2 : vector nat n) : vector nat n :=
  match v1 with
  | vnul => vnul
  | vcons _ x1 v1' =>
    match v2 with
    | vnul => False_rect _ _
    | vcons _ x2 v2' => vcons (x1 + x2) (vpadd v1' v2')
    end
  end.

当 Coq 尝试检查 vpadd 时,会产生以下错误:

Error:
In environment
vpadd : forall n : nat, vector nat n -> vector nat n -> vector nat n
[... other types]
n0 : nat
v1' : vector nat n0
n1 : nat
v2' : vector nat n1
The term "v2'" has type "vector nat n1" while it is expected to have type "vector nat n0".

请注意,我使用False_rect 指定不可能的情况,否则整体检查不会通过。但是,由于某种原因,类型检查器无法将n0n1 统一起来。

我做错了什么?

【问题讨论】:

标签: vector coq idris convoy-pattern


【解决方案1】:

在普通 Coq 中不可能如此轻松地实现此功能:您需要使用 convoy 模式 重写您的功能。不久前有一个similar question 发布了关于此的内容。这个想法是你需要让你的 match 返回一个函数,以便传播索引之间的关系:

Set Implicit Arguments.

Inductive vector (X : Type) : nat -> Type :=
  | vnul : vector X 0
  | vcons {n : nat} (h : X) (v : vector X n) : vector X (S n).
   Arguments vnul [X].

Definition vhd (X : Type) n (v : vector X (S n)) : X :=
  match v with
  | vcons _ h _ => h
  end.

Definition vtl (X : Type) n (v : vector X (S n)) : vector X n :=
  match v with
  | vcons _ _ tl => tl
  end.

Fixpoint vpadd {n : nat} (v1 v2 : vector nat n) : vector nat n :=
  match v1 in vector _ n return vector nat n -> vector nat n with
  | vnul =>           fun _  => vnul
  | vcons _ x1 v1' => fun v2 => vcons (x1 + vhd v2) (vpadd v1' (vtl v2))
  end v2.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多