如何证明 Coq 中的两个 Fibonacci 实现相等?

2023-11-29

我有两个斐波那契实现,如下所示,我想证明它们在功能上是等效的。

我已经证明了自然数的性质,但是这个练习需要另一种我无法弄清楚的方法。

我使用的教科书介绍了 Coq 的以下语法,因此应该可以使用这种表示法来证明相等性:

<definition> ::= <keyword> <identifier> : <statement> <proof>

<keyword> ::= Proposition | Lemma | Theorem | Corollary

<statement> ::= {<quantifier>,}* <expression>

<quantifier> ::= forall {<identifier>}+ : <type>
               | forall {({<identifier>}+ : <type>)}+

<proof> ::= Proof. {<tactic>.}* <end-of-proof>

<end-of-proof> ::= Qed. | Admitted. | Abort.

下面是两个实现:

Fixpoint fib_v1 (n : nat) : nat :=
  match n with
  | 0 => O
  | S n' => match n' with
            | O => 1
            | S n'' => (fib_v1 n') + (fib_v1 n'')
            end
  end.

Fixpoint visit_fib_v2 (n a1 a2 : nat) : nat :=
  match n with
  | 0 => a1
  | S n' => visit_fib_v2 n' a2 (a1 + a2)
  end.

很明显,这些函数在基本情况下计算相同的值n = 0,但是归纳案例更难?

我尝试证明以下引理,但我陷入了归纳案例:

Lemma about_visit_fib_v2 :
  forall i j : nat,
    visit_fib_v2 i (fib_v1 (S j)) ((fib_v1 j) + (fib_v1 (S j))) = (fib_v1 (add_v1 i (S j))).
Proof.
  induction i as [| i' IHi'].

  intro j.
  rewrite -> (unfold_visit_fib_v2_0 (fib_v1 (S j)) ((fib_v1 j) + (fib_v1 (S j)))).
  rewrite -> (add_v1_0_n (S j)).
  reflexivity.

  intro j.
  rewrite -> (unfold_visit_fib_v2_S i' (fib_v1 (S j)) ((fib_v1 j) + (fib_v1 (S j)))).

 Admitted.

Where:

Fixpoint add_v1 (i j : nat) : nat :=
  match i with
  | O => j
  | S i' => S (add_v1 i' j)
  end.

警告:在接下来的内容中,我将尝试展示这种证明的主要思想,因此我不会坚持使用 Coq 的某些子集,也不会手动进行算术。相反,我将使用一些证明自动化,即。这ring战术。但是,请随意提出其他问题,以便您可以将证明转换为适合您目的的形式。

我认为从一些概括开始更容易:

Require Import Arith.    (* for `ring` tactic *)

Lemma fib_v1_eq_fib2_generalized n : forall a0 a1,
  visit_fib_v2 (S n) a0 a1 = a0 * fib_v1 n + a1 * fib_v1 (S n).
Proof.
  induction n; intros a0 a1.
  - simpl; ring.
  - change (visit_fib_v2 (S (S n)) a0 a1) with
           (visit_fib_v2 (S n) a1 (a0 + a1)).
    rewrite IHn. simpl; ring.
Qed.

如果使用ring不适合您的需求,您可以执行多个rewrite使用引理的步骤Arith module.

现在,让我们实现我们的目标:

Definition fib_v2 n := visit_fib_v2 n 0 1.

Lemma fib_v1_eq_fib2 n :
  fib_v1 n = fib_v2 n.
Proof.
  destruct n.
  - reflexivity.
  - unfold fib_v2. rewrite fib_v1_eq_fib2_generalized.
    ring.
Qed.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何证明 Coq 中的两个 Fibonacci 实现相等? 的相关文章

  • 你为什么决定“反对”使用 Erlang?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 你是否真的 尝试过 意味着在其中编程 而不仅仅是阅读有关它的文章 Erlang并决定在项目中不
  • 通过消除嵌套的 for 循环来改进此代码

    R 包corrplot除其他内容外 还包含这个漂亮的功能 cor mtest lt function mat conf level 0 95 mat lt as matrix mat n lt ncol mat p mat lt lowCI
  • 并行化斐波那契序列生成器

    我正在学习并行化 在一项练习中 我得到了一些我应该提高性能的算法 其中之一是斐波那契数列生成器 array 0 0 array 1 1 for q 2 q lt MAX q array q array q 1 array q 2 我怀疑 这
  • 使用 Reader Monad 进行依赖注入

    我最近看到了谈话极其简单的依赖注入 http www youtube com watch v ZasXwtTRkio and 无需体操的依赖注入 http vimeo com 44502327关于 Monads 的 DI 并留下了深刻的印象
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • 计算斐波那契数

    我收到了这个很好的非递归函数 用于计算斐波那契序列 因此 我编写了一些 C 代码 并能够验证 1474 以内的所有数字是否正确 当尝试计算 1475 及以上时就会出现问题 我的 C 数学技能无法胜任找出不同方法的任务 那么 有人有更好的方法
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • 有没有好的 Clojure 基准测试?

    Edit Clojure 基准测试已达到基准游戏 http benchmarksgame alioth debian org u64q clojure html 我已经制作了这个问题社区维基并邀请其他人保持更新 有人知道 Clojure 性
  • 为什么逻辑连接词和布尔值在 Coq 中是分开的?

    我有 JavaScript Ruby 编程背景 并且习惯了 true false 的工作方式 在 JS 中 true false false true 然后你可以使用这些真 假值 like var a true b false a b So
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 如何使用 rxpy/rxjs 延迟事件发射?

    我有两个事件流 一个来自电感环路 另一个来自网络摄像机 汽车将驶过环路 然后撞上相机 如果事件彼此相差在 N 毫秒内 汽车总是会首先进入循环 我想将它们组合起来 但我也希望每个流中不匹配的事件 硬件可能会失败 全部合并到单个流中 像这样的事
  • 需要澄清令人困惑的 Http4s 消息类型 `Response[F]` / `Request[F]`

    我很难理解为什么Request and Response参数化为F 类似的东西是猫效应数据类型资源 从文档中 https typelevel org cats effect docs std resource https typelevel
  • “auto”如何与双条件(关闭)交互

    我注意到 那auto忽略双条件 这是一个简化的示例 Parameter A B Prop Parameter A iff B A lt gt B Theorem foo1 A gt B Proof intros H apply A iff
  • 带参数的 Python 列表过滤

    python中有没有一种方法可以在列表上调用过滤器 其中过滤函数在调用期间绑定了许多参数 例如有没有办法做这样的事情 gt gt def foo a b c return a lt b and b lt c gt gt myList 1 2
  • 为什么斐波那契堆被称为斐波那契堆?

    The 斐波那契堆 http en wikipedia org wiki Fibonacci heap数据结构的名称中有 斐波那契 一词 但数据结构中似乎没有任何内容使用斐波那契数 根据维基百科文章 斐波那契堆的名称来自于运行时间分析中使用
  • 如何将函数转换为点自由形式?

    假设我有一个 JavaScript 函数 function f x return a b x c x 我如何将其转换为无点函数 通过组合函数 还有关于这方面的更多信息的资源吗 一般来说 当您将函数转变为无点风格时 没有简单的规则可遵循 要么
  • 将类型传递给通用 Swift 扩展,或者理想情况下推断它

    说你有 class Fancy UIView 你想找到所有兄弟姐妹Fancy意见 没问题 https stackoverflow com q 37232743 294884 for v UIView in superview subview
  • Swift:配对数组元素的最佳方法是什么

    我遇到了一个需要成对迭代数组的问题 最好的方法是什么 或者 作为替代方案 将数组转换为对数组 然后可以正常迭代 的最佳方法是什么 这是我得到的最好的 这个需要output成为一个var 而且它并不是很漂亮 有没有更好的办法 let inpu
  • 我应该用不可变或可变的数据结构来表示数据库数据吗?

    我目前正在使用 Scala 进行编程 但我想这适用于任何函数式编程语言 或者更确切地说 任何建议不变性并可以与数据库交互的编程语言 当我从数据库中获取数据时 我将其映射到模型数据结构 在函数式编程中 数据结构往往是不可变的 但是数据库中的数
  • 用纯函数式语言保持状态

    我正在尝试弄清楚如何执行以下操作 假设您正在开发直流电机的控制器 您希望让它以用户设置的特定速度旋转 def set point ref sp 90 while true let curr read speed controller set

随机推荐

  • 如何从空手道功能文件中的 .js 文件调用特定的 javascript 函数

    假设我已将以下函数保存在 Utility js 文件中 function getCurrentDate return date function getMonth return Oct 请帮助我如何在功能文件中访问这些方法 我尝试了以下代码
  • HTTP v1 API:用于网络推送通知的“click_action”

    FCM 中的文档主要关注 Android iOS 和我的底层webpush自我正在挣扎click action click action是一个可以在旧 API 中使用的密钥 但似乎不再适用于webpush 对此的唯一具体参考是在这篇博客文章
  • 对 .Net Native 的依赖

    我在提交到应用商店时遇到以下认证错误 我的应用程序名称 依赖于 Microsoft Net Native Runtime Package 1 x 框架 但清单中缺少框架依赖项声明 我的应用程序名称 依赖于 Microsoft Net Nat
  • R 中的正则表达式:查找确切的数字

    这是在R中 grep AB22 c AB22 AB22 AB22 AB22 3 AB226AEM 1 AB22AEM 2 value T 给出所有这些 AB22 AB22 AB22 AB22 3 AB226AEM 1 AB22AEM 2 但
  • 从外部 vagrant 连接到 MySQL

    我想使用 mycli 连接到在 vagrant 实例内运行的 MySQL 服务器 我的基本 Vagrantfile 类似于以下代码片段 Vagrant configure VAGRANTFILE API VERSION do config
  • 画布游戏计时器

    我正在制作一个 HTML5 Canvas 游戏 其中有一个在画布上移动的矩形 目标是尽可能长时间地躲避在画布上移动的多个球 但我正在努力设置一个计时器 以在球击中矩形时显示您的时间 得分 矩形由上 下 左 右键移动 任何了解这方面知识的人可
  • C++ 向量总是连续的吗? [复制]

    这个问题在这里已经有答案了 可能的重复 std vector 元素是否保证是连续的 我遇到过一种技术 人们在 C 中使用向量来接收或发送 MPI 操作的数据 因为据说它在内存中连续存储元素 然而 我仍然怀疑这种方法对于任何大小的向量是否保持
  • fromJSON 中的多个 JSON 对象

    我正在尝试使用fromJSON 读取具有多个对象的 json 文件 结构如下 key11 value11 key12 value12 key11 value11 key12 value12 如果我手动添加 整个文件用括号括起来 以及 对象之
  • static const C++ 类成员已初始化在链接时给出重复符号错误

    我有一个类 它有一个静态常量数组 它必须在类之外初始化 class foo static const int array 3 const int foo array 3 1 2 3 但后来我在 foo o 和 main o 中得到了重复的符
  • 如何向 Symfony 添加 Ajax 功能

    我在页面中有一组会话 我想使用 AJAX 删除它们 即单击链接 无需导航到新页面 只需删除会话 并显示成功消息 现在 根据给定的答案 这对我来说仍然不起作用 我有以下内容 控制器 use Symfony Component HttpFoun
  • 如何删除UIWebView的所有cookie?

    在我的应用程序中 我有一个UIWebview加载用于登录的 linkedin 身份验证页面 当用户登录时 cookie 会保存到应用程序中 我的应用程序有一个与 linkedin 登录无关的注销按钮 因此 当用户单击此按钮时 他将从应用程序
  • 使用struts 2和hibernate在jsp页面中显示Blob(图像)

    我设法将图像作为 Blob 存储在我的 mysql 数据库中 我也在使用休眠 现在我正在尝试加载该图像并将其发送到 jsp 页面上 以便用户可以查看该图像 这是我的 struts 2 动作类 import java io File impo
  • 如何捕捉父控件调整大小的时刻?

    我有一个源自 TWinControl 的可视化组件 当组件的父控件大小调整后 我需要在组件中做一些工作 一般情况下 我的组件的 对齐 属性是 alNone 如何捕获父控件调整大小的事件 是否可以 如果 TWinControl 父级 的大小发
  • 是否可以使用 Autodesk.AutoCAD.Interop 在 AutoCAD 中编辑块属性?

    我开发了一个外部 WPF 应用程序来用 C 生成绘图 我已经能够使用 Autodesk AutoCAD Interop 绘制 标注尺寸 添加块以及应用程序所需的所有其他内容 但是我似乎无法填充标题栏或生成零件列表 我见过的所有示例都基于要求
  • prometheus relabel_config 删除操作不起作用

    我一直在尝试删除未使用的指标 在抓取之前 以减轻 Prometheus 集群上的负载relabel configs job name nginx ingress controller metrics kubernetes sd config
  • 表不是由 Hibernate 创建的

    我注释了一堆 POJO 以便 JPA 可以使用它们在 Hibernate 中创建表 看起来除了一个名为 Revision 的非常核心的表之外 所有表都已创建 Revision 类有一个 Entity name RevisionT 注解 因此
  • python3 cvxopt.matrix 和 numpy.array 之间的转换

    蟒蛇 蟒蛇3 2 CVXOPT 1 1 5 numpy 1 6 1 I read http abel ee ucla edu cvxopt examples tutorial numpy html import cvxopt import
  • 计算两个日期之间的工作日数

    我正在尝试获取 plpgsql 中两个日期之间的工作日数 以下是我的代码 CREATE FUNCTION weekdays DATE DATE RETURNS INTEGER AS DECLARE d date 1 weekdays int
  • Google GeoCoding API - 返回 ZERO_RESULTS 但位置显示在 Google 地图上

    我正在使用 Google GeoCode API 从地址搜索位置并获取该位置的 LAT LON 信息 从API我总是得到ZERO RESULTS就好像我从谷歌地图中搜索地址一样 它会显示位置 我搜索的地址是 5989 Route 6N Ed
  • 如何证明 Coq 中的两个 Fibonacci 实现相等?

    我有两个斐波那契实现 如下所示 我想证明它们在功能上是等效的 我已经证明了自然数的性质 但是这个练习需要另一种我无法弄清楚的方法 我使用的教科书介绍了 Coq 的以下语法 因此应该可以使用这种表示法来证明相等性