在 Coq 中实现向量加法

2023-12-02

在某些依赖类型语言(例如 Idris)中实现向量加法相当简单。根据维基百科上的例子:

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 库:

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指定不可能的情况,否则完整性检查将无法通过。然而,由于某种原因,类型检查器无法统一n0 with n1.

我究竟做错了什么?


在普通 Coq 中不可能如此轻松地实现这个函数:您需要使用以下代码重写您的函数车队模式。有一个类似的问题不久前发布了关于此的内容。这个想法是你需要让你的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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Coq 中实现向量加法 的相关文章

随机推荐

  • E*Trade API 在获取访问令牌时经常返回 HTTP 401 Unauthorized,但并非总是如此

    Summary 我编写了一个简单的 C NET Core 应用程序 使用 OAuthv1 对 E Trade API 进行身份验证 目的是获取股票报价 我能够进行身份验证并获取请求令牌 重定向到授权页面并获取验证程序字符串 但是 当我使用验
  • 通过 Zip Google Geocode Api 查找城市和州 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我基本上想检索邮政编码内的城市和州列表 Google Geocode API 可以这样做吗 我尝试查看文档 但发现信息过多 任何帮助 将不胜感激 如
  • 使用 C 访问 Twitter Streaming API

    我正在尝试使用 C 访问 Streaming API 并使用以下代码 include
  • 在 Windows 服务 C# 中引发自定义类事件

    我确实编写了一个可以使用 dll 连接到网络设备的 Windows 服务 所以一切正常 但是事件处理程序在 win 服务中不起作用 这是我的代码 我的自定义类代码 using System using System Collections
  • 浏览器之间的颜色(颜色)差异?

    我刚刚注意到我正在处理的一个网站在 Chrome 中看起来与其他浏览器 saf ff 不同 Chrome 中的所有内容都更加饱和 甚至是背景色 rgb 我不知道是什么导致了这种情况发生 不能与 img 颜色配置文件有任何关系 否则 rgb
  • 在 Swift 中创建一个接受本机 Swift 协议的弱容器

    这是 Swift 中的标准样板弱容器 struct Weak
  • 为每条记录保存带有新行的 R JSON 对象

    我正在尝试保存一个 JSON 对象 其中每一行都是一条记录 如何保存 JSON 对象以使行数等于记录数 在下面的示例中为 5 library jsonlite df mtcars 1 5 x lt jsonlite toJSON df re
  • 什么是投影和选择?

    投影和选择有什么区别 是吗 投影 gt 用于选择表的列 和 选择 gt 选择表的行 那么投影和选择分别是垂直和水平切片吗 Exactly 投影意味着选择哪些列 或表达式 查询应返回 选择 means 哪些行将被退回 如果查询是 select
  • 如何让物体沿圆弧路径运动?

    我正在制作一个游戏 其中应该有一个机器人向另一个机器人扔球形物体 投出的球应以对称的弧线飞行 很确定这个数学词是抛物线 两个机器人都在 x 轴上 我怎样才能在我的游戏中实现这样的事情 我尝试了不同的方法 但没有一个有效 我的游戏中当前移动物
  • 透明背景模糊的 JFrame

    我想对 JFrame 的背景进行模糊处理 该背景是透明的以显示其下方发生的情况 但我不知道如何模糊背景并避免闪烁 我想要实现的是拥有一个稍微模糊的透明背景 但仍然显示其下方窗口的 实时视图 而不是拥有不改变的模糊静态图片 请记住 窗口可能会
  • Laravel 中的二维码

    我想制作qr码 在那里我可以制作它 但是当我想将qr码的格式更改为png文件时遇到麻烦 但它唯一的显示符号 这是我的观点 我使用这个二维码 simplesoftwareio simple qrcode 1 这是我的参考 https www
  • 对自己调用复制构造函数

    我很好奇我几乎错误地编写的这段代码中发生了什么 include
  • 将图像从网页的 html 部分拖放到画布上后如何访问图像数据?

    这是一个后续问题如何将文本和图像拖放到画布上 火狐41 0 1 我根本不知道如何访问我放到画布上的图像的图像数据 我尝试过类似的事情data event dataTransfer getData image 但这一切都不起作用 functi
  • 如何制作编号段落(HTML5/CSS3)

    我正在编写 HTML5 中的 QuickBASIC 4 5 指南 并且我已经得到了很多工作 但我想知道如何对我的代码行进行编号 或停止文本换行 目前 我的代码如下所示 1 PRINT Hello World 2 INPUT Who are
  • RSelenium 无法打开浏览器

    我想使用 Selenium 从 R 进行网页抓取 我的Windows版本 Windows 11 21H2 我有最新的 Java 更新 1 8 0 351 评论它 因为我已经看到它可能是这种情况下的修复 但是 在定义驱动程序对象时 出现以下错
  • 如何退出 git log 或 git diff [重复]

    这个问题在这里已经有答案了 我正在尝试在以下的帮助下学习 Git沉浸式 Git 每当我使用时 有一件事让我感到沮丧git log or git diff 当我遇到这种情况时 我不知道下一步该怎么做 END word 我无法输入任何命令 最终
  • 将巨大图像(5mb)加载到 svg 背景中会导致像素化和性能问题

    我有一些问题像素化和表现SVG 背景图像与 D3 js 一起 您已经可以在这里看到一个正在运行的示例 http arda maps org ages first 请不要分享 直到它仍然是 Alpha 版本 谢谢 Example So let
  • 如何创建带有日期的图表工具提示(日期时间格式)

    我无法获得正确格式的提示 foreach RootObject o in myRootObjects seriesTemperatur Points AddXY DateTime Parse o datum o temp seriesPre
  • Perl 5.8.8 不支持 XML::LibXML 吗?

    我回答了一个question不久前我最初建议使用 XML DOM 后mirod建议我使用 XML LibXML 代替 我实现了它 说实话 它在我的系统上运行得很好 我发现新模块的运行时间大幅下降 而无需进行任何额外的优化 现在棘手的部分是
  • 在 Coq 中实现向量加法

    在某些依赖类型语言 例如 Idris 中实现向量加法相当简单 根据维基百科上的例子 import Data Vect default total pairAdd Num a gt Vect n a gt Vect n a gt Vect n