首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Coq中使用mod算法(特别是Zplus_mod定理)来处理自然数?

如何在Coq中使用mod算法(特别是Zplus_mod定理)来处理自然数?
EN

Stack Overflow用户
提问于 2020-06-14 04:10:21
回答 1查看 203关注 0票数 0

我想应用图书馆定理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Theorem Zplus_mod: forall a b n, (a + b) mod n = (a mod n + b mod n) mod n.

其中a b n的类型为Z

我的目标中有一个子表达式(a + b) mod 3,使用a b : nat

rewrite Zplus_mod给出了一个错误Found no subterm matching

rewrite Zplus_mod with (a := a)给出了一个错误"a" has type "nat" while it is expected to have type "Z".

由于自然数也是整数,如何将Zplus_mod定理用于nat参数

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-14 22:15:50

您不能应用这个定理,因为表示法mod在使用自然数的上下文中引用了自然数Nat.modulo上的函数,而当您引用Z类型的整数时,表示法mod是指Z.modulo

使用Search命令ou可以专门搜索关于Nat.modulo(_ + _)%nat的定理,您将看到一些现有的定理实际上非常接近您的需要(Nat.add_mod_idemp_lNat.add_mod_idemp_r)。

你也可以找一个把Z.moduloNat.modulo联系起来的定理。这给了mod_Zmod。但这迫使您在整数类型中工作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Require Import Arith ZArith.

Search Z.modulo Nat.modulo.

 (* The answer is :  
    mod_Zmod: forall n m, m <> 0 -> Z.of_nat (n mod m) = 
       (Z.of_nat n mod Z.of_nat m)%Z  *)

一种方法是找到一个定理,它告诉你函数Z.of_nat是内射的。我是通过输入以下命令找到它的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Search Z.of_nat "inj".

在产生的长列表中,相关的定理是Nat2Z.inj,然后您需要展示Z.of_nat如何与所涉及的所有操作符交互作用。大部分这些定理都要求n是非零的,所以我把它作为一个条件。这是一个例子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Lemma example (a b n : nat) : 
   n <> 0 -> (a + b) mod n = (a mod n + b mod n) mod n.
Proof.
intro nn0.
apply Nat2Z.inj.
rewrite !mod_Zmod; auto.
rewrite !Nat2Z.inj_add.
rewrite !mod_Zmod; auto.
rewrite Zplus_mod.
easy.
Qed.

这回答了您的问题,但坦率地说,我相信您最好使用引理Nat.add_mod_idemp_lNat.add_mod_idemp_r

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62372315

复制
相关文章
Python算法解析:寻找最短路径!
最短路径算法用于在图中找到两个节点之间的最短路径。最短路径问题在许多实际应用中都有重要的作用,例如网络路由、导航系统等。
测试开发囤货
2023/08/08
6490
Python算法解析:寻找最短路径!
java算法之寻找最小的k个数--1
1.快排,不讲了 2.定义一个小根堆,比如priorityqueue,添加数据,利用小根堆每次弹出最小值即可
名字是乱打的
2021/12/22
2610
Prim算法生成最小生成树
由一个带权值的联通图到一个最小生成树的过程,其实就是从图的所有边中挑出一部分边用来组成树的过程,所以关键在于如何挑选边。
叶茂林
2023/07/30
1920
Prim算法生成最小生成树
最短路径生成树与最小生成树
虽然放在一起,但是他们两个除了都是树之外没有一点关系。 最短路径生成树,就是ROOT根节点到达任意点距离最短的路径所构成的树,就是最短路径生成树。我画两个图给大家理解。
风骨散人Chiam
2020/10/28
1.1K0
最短路径生成树与最小生成树
图的最小生成树算法
在上一篇文章中,我们看了一下图的遍历算法,主要是对图的深度优先遍历和图的广度优先遍历算法思想的介绍。接下来让我们来看一下图的最小声成树算法。
指点
2019/01/18
2.6K0
图的最小生成树算法
最小生成树的Kruskal算法
定义: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。[1] 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。 Kruskal算法简述: 假设 WN=(V,{E}) 是一个含有 n 个顶点的连通网,则按照克鲁斯卡尔算法构造最小生成树的过程为:先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。之后,从网的边集 E 中选取一条权值最小的
用户3577892
2020/06/12
2K0
最小生成树的个数_最小生成树的两种算法
设最小生成树的边权之和为 sum,严格次小生成树就是指边权之和大于 sum 的生成树中最小的一个。
全栈程序员站长
2022/09/22
9800
寻找矩阵中的路径
给定一个矩阵和一个字符串,如何从矩阵中寻找出这个字符串在矩阵中的路径?本文就跟大家分享下如何使用回溯法来解决这个问题,欢迎各位感兴趣的开发者阅读本文。
神奇的程序员
2022/04/10
1.1K0
寻找矩阵中的路径
Prim算法-最小生成树
基本思想: 1 置S={1} 2 只要S是V的真子集就做如下的贪心选择:   选取满足条件的i ,i属于S,j输入V-S,且c[i][j]最小的边,并将定点j加入S中   这个过程直到S==V为止。 3 这个过程所选的边,恰好就是最小生成树 算法描述: void Prim(int n,Type * * c) { T = 空集; S = {1}; while(S != V) { (i,j)=i 属于 S 且 j属于V-S的最小权边; T = T∪
用户1154259
2018/01/17
2.6K0
动画演示广度优先算法寻找最短路径
上一节,我们刚刚介绍了使用深度优先算法(DFS)解决迷宫问题,这一节我们来介绍广度优先算法(BFS)。BFS 算法与 DFS 十分相似,唯一的区别就是 DFS 算法使用后进先出的栈来保存节点,而 BFS 算法使用先进先出的队列来存储节点,除此之外简直就是一母同胞的亲兄弟。当然,这两种方案各有千秋。DFS 算法找到的路径往往不是最短路径,速度慢但占用内存较少,而 BFS 算法找到的总是最短路径,速度较快但占用内存较多。
用户2870857
2019/12/23
2.1K0
动画演示广度优先算法寻找最短路径
Kruskal算法-最小生成树
算法思想: 1 将G的n个顶点看成n个孤立的连通分支,所有的边按权从小到大排序 2 当查看到第k条边时,   如果断点v和w分别是当前的两个不同的连通分支t1和t2中的顶点时,就用边(v,m)j将t1,t2连接成一个连通分支,然后继续查看第k+1条边;   如果端点v和w当前的同一个连通分支中,就直接查看第k+1条边 实现代码: template <class Type> class EdgeNode{ friend ostream& operator<<(ostream&,EdgeNode<Typ
用户1154259
2018/01/17
2.1K0
☆打卡算法☆LeetCode 64、最小路径和 算法解析
链接:64. 最小路径和 - 力扣(LeetCode) (leetcode-cn.com)
恬静的小魔龙
2022/08/07
2800
☆打卡算法☆LeetCode 64、最小路径和  算法解析
图算法|Prim算法求最小生成树
01 — 一个实际问题 要在n个城市之间铺设光缆,要求有2个: 这 n 个城市的任意两个之间都可以通信; 铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此要使铺设光缆的总费用最低。 如下所示
double
2018/04/02
4K0
图算法|Prim算法求最小生成树
最小生成树(Kruskal算法和Prim算法)
上一篇文章,我们讲了图的创建和遍历,其中遍历的算法主要有BFS(广度优先算法)和DFS(深度优先算法)两种,并且DFS算法对很多问题都有很好的启示!而今天我们要说一个非常实用的算法——最小生成树的建立!这是图论中一个经典问题,可以使用Kruskal和Prim两种算法来进行实现!
算法工程师之路
2019/08/05
5.3K0
最小生成树算法:Kruskal 与 Prim算法
连通图中的每一棵生成树,都是原图的一个极大无环子图,即:从其中删去任何一条边,生成树就不再连通;反之,在其中引入任何一条新边,都会形成一条回路。
利刃大大
2023/04/12
2K0
最小生成树算法:Kruskal 与 Prim算法
Kruscal(最小生成树)算法模版
1 const int maxn=400;//最大点数 2 const int maxm=10000;//最大边数 3 int n,m;//n表示点数,m表示边数 4 struct edge{int u,v,w;} e[maxm];//u,v,w分别表示该边的两个顶点和权值 5 bool cmp(edge a,edge b) 6 { 7 return a.w<b.w; 8 } 9 int fa[maxn];//因为需要用到并查集来判断两个顶点是否属于同一个连通块 10 int fi
Angel_Kitty
2018/04/09
1.4K0
最小生成树-Prim算法和Kruskal算法
Prim算法 1.概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点(英语:Vertex (graph theory)),且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克(英语:Vojtěch Jarník)发现;并在1957年由美国计算机科学家罗伯特·普里姆(英语:Robert C. Prim)独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算
用户1215536
2018/02/05
3.7K0
最小生成树-Prim算法和Kruskal算法
最小路径问题 | Dijkstra算法详解(附代码)
来源:AI蜗牛车本文共3400字,建议阅读6分钟本文对Dijkstra算法做了一个详细的介绍。 一、最短路径问题介绍 1、从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径。 2、解决问题的算法: 迪杰斯特拉算法(Dijkstra算法) 弗洛伊德算法(Floyd算法) SPFA算法 这篇文章,就先对Dijkstra算法来做一个详细的介绍~ 二、Dijkstra算介绍 算法特点 迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路
数据派THU
2022/05/31
5K0
最小路径问题 | Dijkstra算法详解(附代码)
最小生成树(Prim算法和Kruskal算法算法详解)
通俗易懂的讲就是最小生成树包含原图的所有节点而只用最少的边和最小的权值距离。因为n个节点最少需要n-1个边联通,而距离就需要采取某种策略选择恰当的边。
bigsai
2019/10/21
3.9K0
最小生成树(Prim算法和Kruskal算法算法详解)
最小生成树之Prim算法和Kruskal算法
一个连通图可能有多棵生成树,而最小生成树是一副连通加权无向图中一颗权值最小的生成树,它可以根据Prim算法和Kruskal算法得出,这两个算法分别从点和边的角度来解决。
业余草
2019/01/21
1.8K0
最小生成树之Prim算法和Kruskal算法

相似问题

寻找最小瓶颈路径的线性时间算法

10

算法:寻找最小倍数

11

用什么算法来寻找最小生成森林?

12

寻找选定顶点的最小生成树的算法

11

寻找算法:生成二部图的最小割集

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文