首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Agda中,我如何证明uncons over coinductive list(也称为Stream)之后的cons是恒等的?

在Agda中,要证明uncons over coinductive list(也称为Stream)之后的cons是恒等的,可以按照以下步骤进行:

  1. 首先,需要定义coinductive list(Stream)的数据类型。可以使用Agda的codata关键字来定义一个无限延迟的列表类型,类似于以下方式:
代码语言:txt
复制
codata Stream (A : Set) : Set where
  _::_ : A -> Stream A -> Stream A

这里的Stream是一个类型构造器,它接受一个类型A作为参数,并返回一个类型Stream A。::是Stream的构造器,它接受一个元素A和一个Stream A,并返回一个新的Stream A。

  1. 接下来,可以定义uncons函数,它从Stream中提取第一个元素和剩余的Stream。可以使用Agda的corec关键字来定义一个无限延迟的函数,类似于以下方式:
代码语言:txt
复制
corec uncons {A : Set} : Stream A -> A × Stream A
uncons (x :: xs) = (x , xs)

这里的uncons函数接受一个Stream A作为参数,并返回一个类型为A × Stream A的元组,其中第一个元素是Stream的头部元素,第二个元素是Stream的尾部。

  1. 最后,可以使用Agda的refl函数来证明uncons over coinductive list之后的cons是恒等的。可以使用Agda的rewrite关键字来重写等式,类似于以下方式:
代码语言:txt
复制
uncons_cons_eq : {A : Set} (x : A) (xs : Stream A) -> uncons (x :: xs) ≡ (x , xs)
uncons_cons_eq x xs rewrite refl = refl

这里的uncons_cons_eq函数接受一个元素x和一个Stream A作为参数,并返回一个等式,证明uncons (x :: xs)等于(x , xs)。使用rewrite关键字和refl函数来重写等式,将等式的两边都替换为refl,从而证明它们是相等的。

以上是在Agda中证明uncons over coinductive list之后的cons是恒等的的步骤。在实际应用中,可以根据具体的场景和需求,选择合适的腾讯云相关产品和服务来支持和扩展云计算领域的应用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

泛函编程(12)-数据流-Stream

在前面的章节我们介绍了List讨论了List数据结构和操作函数。List这个东西从外表看上去挺美,但在现实中使用起来却可能很不实在。为什么?...其二,List抽象算法如折叠算法、map, flatMap等无法中途跳出,无论如何都一直进行到底;只有通过递归算法才能在中途停止运算。但递归算法不够抽象,经常出现重复代码。...可以想象一下可能原理:Stream内元素读取具体使用时才进行。不用说,Stream典型只读数据类型。既然要继承List计算模式,那么结构设计上是否相同呢?...//> res7: List[Int] = List(3) 从操作结果可以确定:Stream操作都是对操作描述,延后计算。...10 12 #:: 14 #:: Stream() 以上#::cons操作符号。

63750

泛函编程(14)-try to map them all

这个管子就是这么一个东西:F[A],我们说F一个针对元素A高阶类型,其实F就是一个装载A类型元素管子,A类型相对低阶,或者说是基础类型。...泛函编程风格就是F内部用对付A类函数对里面的元素进行操作。但在之前现实编程确总是没能真正体会这种编程模式畅顺用法:到底应该在哪里用?怎么用?可能内心里还是没能摆脱OOP思维方式吧。...Option里,本意Stream就可以用None来表示。...这个Option就像是那个附加套子把我们目标类型(A, Stream[A])套成了F[A]类型。其实我们目的对管子里A类型进行操作,特别是对A类型元素进行模式匹配。...但是之前设计里我们却对F[A]这个戴着套子类型进行了模式匹配。静下来回顾一下觉着还是必须想办法尽量多用些泛函方式来做。

50670

泛函编程(13)-无穷数据流-Infinite Stream

这让不禁联想到我们常用数据搜索读取方式了:大量数据存放在数据库里,就好像无穷数据源头。...我们把数据读取方式(那些数据库读写API函数)嵌入Stream操作函数内,把数据搜索条件传入Stream构造器(constructor)形成一个对数据搜索操作描述。...这个产生Stream只有我们调用符合搜索条件数据库记录时才会逐个从数据库读取出来。这可是一个非常熟悉场景,但我们常常会思考它原理。  ...List[Int] = List(0, 1, 1, 2, 3) 从以上这些例子可以看出:我们不断重复cons。...[Int] = List(11, 12, 13, 14, 15) S类型即uncons类型>>>Option[(A, Stream[A])], uncons新状态 Some((t.head, t.tail

60850

用了一段时间Agda感想

其实之前知道Agda,但是由于Coq相关资料更多,而且那时候Windows平台上无法安装Agda(old-times库问题),于是拖到近来PLFA这本书中文翻译动工才开始跟着看。...虽然都以有类型λ演算为理论基础(AgdaUTT,Coq归纳构造演算),但是表现在证明上,两者就有很大不同了。Agda,命题证明就是给出一个类型一个项。...可以说,Agda证明一个命题能充分体现Curry-Horwad同构实质。进一步说,Agda根本没有强调“证明”,而你每一次证明,其实都是C-H同构体现。而Coq却完全相反。...Agda证明并没有用Function.Equality_⇔_,因为个人觉得那个东西非常复杂。 证明过程Agda实际上辅助使用者获得某类型项。...综上,如果数学证明大概会选择Coq。如果用来实现论文里Type System,我会更青睐于使用Agda

1.4K10

【好声音】 ScalaStream应用场景及其实现原理

这两种解法去除多余运算这个缺点同时把原来优点给丢掉了,我们又退化回了描述如何做而不是做什么程度了。 如何保持代码表意性而又不用做多余运算呢?...接下来就看一下这两个晦涩名词如何帮助Stream完成工作吧。 实现原理 在这里借用一下Functional programming in Scala这本书里对Stream实现代码。...两个类Cons和Empty实现了这个trait。这里,Empty当然代表空Stream了。而Cons则是头尾结构,头Stream一个元素,尾Stream余下元素。...如果说普通集合包含数据的话,那Stream中所包含就是能够产生数据算法。 如何?是不是花朵花苞感觉又回来了? 还记得我们开始剖析时候那句代码是什么吗?...就在于List先把数据构造出来,然后一堆数据挑选我们心仪数据。而Stream先把算法构造出来,挑选心仪算法,最后只执行一大堆算法我们需要那一部分。这样,自然就不会执行多余运算了。

89650

编程修炼 | ScalaStream应用场景及其实现原理

这两种解法去除多余运算这个缺点同时把原来优点给丢掉了,我们又退化回了描述如何做而不是做什么程度了。 如何保持代码表意性而又不用做多余运算呢?...接下来就看一下这两个晦涩名词如何帮助Stream完成工作吧。 实现原理 在这里借用一下Functional programming in Scala这本书里对Stream实现代码。...两个类Cons和Empty实现了这个trait。这里,Empty当然代表空Stream了。而Cons则是头尾结构,头Stream一个元素,尾Stream余下元素。...如果说普通集合包含数据的话,那Stream中所包含就是能够产生数据算法。 如何?是不是花朵花苞感觉又回来了? 还记得我们开始剖析时候那句代码是什么吗?...就在于List先把数据构造出来,然后一堆数据挑选我们心仪数据。而Stream先把算法构造出来,挑选心仪算法,最后只执行一大堆算法我们需要那一部分。这样,自然就不会执行多余运算了。

62450

日拱一卒,伯克利教你用Lisp写递归,写完后感觉代码更溜了

个人理解除了让大家多学一门语言,拓展大家知识面之外,也是给之后用Python实现Lisp解释器project打基础。...我们可以使用car和cdr过程来分别获取pair第一和第二个元素: 我们可以嵌套cons来让一个pair元素另外一个pair 你可能会好奇,为什么第一个例子((1 . 2) . 3)第一个点在第二个例子消失了...为了更好理解,首先观察下面这个pair构造: 这被称为malformed list(畸形),因为它调用cdr得到不是一个well-formed list或者nil,因为你依然可以看到点。...,用19年图做出来不对,正确答案: (define lst (cons (list 1) (cons 2 (cons (cons 3 4) (list 5)))) ) 这个代码用老师给在线作图工具得到结果这样...由于Scheme list一个接近链表结构,我们从头开始遍历。我们可以每次拿到元素之后,对剩下list进行去重。这样可以保证每次从list拿到都是和之前所有元素都不重复元素。

59540

日拱一卒,期末测试,伯克利61A完结篇

要解决这个问题,需要我们再定义一个函数,比如这里定义了一个dfs函数,它接收funcs表示函数list,以及一个数x,即执行过程中间结果。...尾递归需要我们函数返回语句上不进行任何依赖当前运行环境操作,最简单办法就是把递归结果当做函数参数传入,这样就可以摆脱当前运行环境依赖。...一个相同数字序列被称为一个run。比如下面这个有限序列: 它可以被分成4个run: 注意,每个list第一个元素run元素,第二个元素它出现次数。...s) (cons-stream (list v cnt) nil)) ((equal?...嵌套list当中它每一个元素都可能另外一个list。比如(1 (2) 3)。 它返回一个list,和s结构一样,但当中每一个元素都是调用fn之后结果,比如: 你可以使用list?

50930

日拱一卒,伯克利CS61A,如何用scheme判断链表有环?

作者 | 梁唐 出品 | 公众号:Coder梁(ID:Coder_LT) 大家好,日拱一卒,梁唐。 我们今天继续来肝CS61A这门公开课,这次我们来看作业11....原始文档:https://inst.eecs.berkeley.edu//~cs61a/sp18/hw/hw11/ 这次作业只有三题,主要都是关于Schemestream用法。...当你完成之后,进行测试: python3 ok -q scale-stream 答案 这题很简单,也是一个简单递归。...主要我们递归当中创建stream时,需要使用cons-stream而非cons (define (scale-stream s k) (if (null?...函数对你也许很有用,它可以判断两个stream是否相同 当你开发完成之后,进行测试: python3 ok -q has-cycle 答案 同样一个递归问题,我们可以把所有遍历到scheme list

62420

编程实践 | Scala亮瞎Java眼(一)

比较Java 8,重点讲解了Scala的如下优势: 简洁代码 支持OO与FP 高阶函数 丰富集合操作 Stream支持 并发支持 简洁代码 Scala提供脚本特性以及将函数作为一等公民方式,使得它可以去掉不少...Scala提供类型推断机制,使得代码精简成为可能。Scala还有一个巧妙设计,就是允许定义类同时定义该类主构造函数。大多数情况下,可以避免我们声明不必要构造函数。...Scala 2.11版本,还突破了样例类属性个数约束。由于样例类不变能实现trait,因而通常作为message而被广泛应用到系统。...演讲主要提及了纯函数定义,并介绍了应该如何设计没有副作用纯函数。纯函数针对给定输入,总是返回相同输出,且没有任何副作用,就使得纯函数更容易推论(这意味着它更容易测试),更容易组合。...相同之处都是针对List元素进行运算,运算规律计算两个元素,将结果与第三个元素进行计算,然后依次类推。

75250

讲透JAVA Streamcollect用法与原理,远比你想象更强大

前面的文章《吃透JAVAStream流操作,多年实践总结》呢,对Stream整体情况进行了细致全面的讲解,大概介绍了下结果收集器Collectors常见用法 —— 但远不是全部。...恒等处理Collector 所谓恒等处理,指就是Stream元素经过Collector函数处理前后完全不变,例如toList()操作,只是最终将结果从Stream取出放入到List对象,并没有对元素本身做任何更改处理...: 恒等处理类型Collector实际编码中最常被使用一种,比如: list.stream().collect(Collectors.toList()); list.stream().collect...,可以是一个累加器实例,总之用来存储结果数据accumlator元素进入收集器具体处理操作finisher当所有元素都处理完成后,返回结果前对结果最终处理操作,当然可以选择不做任何处理...Collector收集器,这几个接口之间如何配合处理并将Stream数据收集为需要输出结果呢?

1.9K11

陶哲轩等重写论文回应争议:七种证明,全面回顾“颠覆数学常识”公式怎么来

陶哲轩 陶哲轩在这篇博客承认,写第一篇文章之前团队并不知道此恒等式之前曾在历史文献多次出现。 ?...我们几个月前发布第一个比较简略版本论文时,我们并不知道这个恒等以前文献多次出现,过去和其他研究人员关于随机矩阵理论论文中曾经使用过相关恒等式,但就我们所知,这个恒等式似乎新出现...即使几个月前,我们第一篇论文发表之后到现在,我们一篇其他论文中见到这个恒等引用。...我们尚不清楚如何最好地将作者权归属于特征向量特征值恒等式。最早包含隐含恒等参考文献由Lowner 提出,但含义并不直接,该参考文献仅对随后文献产生了适度影响。...略读了这篇论文新改写版本,它看起来很有趣。我会尽量在有时间时候(希望几个小时内)好好读一读。” ?

1.3K10

SCIP学习笔记

SCIP分五章:构造过程抽象,构造数据抽象,模块化、对象和状态(涉及并发),源语言抽象,寄存器机器里计算(编译器如何工作) 环境 OS X下使用IDE DrRacket及其语法插件#PLaneT neil...Lisp基本语法 Lisp原始定义John McCarthy1960发表论文[3]。 Lisp[4]一个语言族,包括Common Lisp和Scheme,二者区别见[5]。...构造数据抽象 闭包 (这里指不是匿名函数) 处理符合数据一个关键思想:用于组合数据对象粘合剂,不但能用于组合基本数据对象,同样可以用复合数据对象。...Wiki: 闭包引用了自由变量函数 序对 用来粘合两个对象,用法: (define x (cons 1 2)) (car x) ; 1 (cdr x) ; 2 序对一种定义: (define...(car__ (cons__ 33 99)) ;33 (cdr__ (cons__ 33 99)) ;99 序列(列表) 可看做嵌套序对: (list ...

1.5K40

当我们谈论Monad时候(二)

不过由于列表可以是任意长,因此需要定义一个链状结构 data List a = Nil | Cons a (List a) infixr 5 `Cons` Haskell,用`包裹函数可以作为中缀函数使用...Applicative对“应用”抽象,它允许容器“存放”一个函数。 还是用例子来说明。上一篇文章最后,举了一个多参函数例子。当时我们封装了一个函数liftM2用来处理2参数函数。...IO操作,这个优势还可以变得更加明显。Haskell采用Monad实现IO相关API,这个Monad就称为IO Monad。...调用形式上看,>>=左侧之前运算结果,而右侧通过λ参数将这个结果引入了进来,以供之后使用。但是左侧与右侧并没有联系,因此之后运算是无法依赖于之前运算。...就这些内容能写这么多,没有想到。原本这篇文章想简单讲讲Monad实现,之后再写点Haskell中常见Monad

78010

函数式编程简介

针对其中第2个决定数学基础问题——算术公理之相容性,年轻的哥德尔提出了哥德尔不完备定理,解决了这个问题形式化之后前两点,即数学完备吗?数学相容吗?哥德尔用两条定理给出了否定回答。...所谓不完备,即系统存在一个为真,但是无法系统推导出来命题。比如:U说:“UPM不可证”。虽然和说谎者很类似,但其实有明显差异。...我们可以假设U为可证,那么可以推出PM矛盾(不相容);但是假设U不可证,却推导不出PM矛盾。U含义PM不可证,而事实上,它被证明不可证,所以UPM不可证真命题。...如果一个(强度足以证明基本算术公理)公理系统可以用来证明它自身相容性,那么它是不相容。 而最后一个问题,数学确定吗?...为了提高统计效率,可以进行分组,然后每组自行报数,最后统计结果。但是如果白板上写个数字1,然后让大家来过来该这个数字,很大可能会出现错误,因为这个数字成为了竞态条件。

1.6K41

Scheme语言实例入门--怎样写一个“新型冠状病毒感染风险检测程序” 1,表达式2,原子3,表(list) 4,点对(pair)5,向量(vector)6,变量7,

虽然一个老码农,但一直不赞成教小学生学编程,觉得这是揠苗助长,小学生不应该过早固化逻辑思维而放松形象思维,某些少儿编程机构居然教学C++游戏编程,觉得这真是摧残祖国花朵。...有了这个风险测试表,如何简单有效用程序表示,这也是选择使用Scheme语言来写这个程序原因,因为它S表达式具有程序和数据一致性,也就是说我们知识数据可以表达为一种等价程序结构,比如将上表身体症状表达为下面的程序结构...6 6) 在当前项目实例,我们将所有相关症状变量放到一个向量: (define QA (vector A1 A2 A3 A4 A5)) 之后,我们会在程序循环遍历这些症状表,获取向量QA长度,...do并不常见,但语法do可以用于表达重复。...推理过程就是与用户交互过程,通过询问用户问题,如果该问题与预先定义不确定性特征知识相匹配,那么就可以计算它对应概率值(本项目中风险值)。

1.5K20

有限域(1)

环要满足以下条件:   1.环所有元加法上一个交换群(Abel Group)(满足结合律,交换律,存在e元,这里我们称之为0元,满足每个元都有唯一逆元)。   ...2.环所有元乘法上一个半群(即只要满足结合律)。   3.加法、乘法满足左分配律和右分配律。   来举几个例子,比如所有的整数加法、乘法下就是一个环。   ...涉及到公平性问题,又带来了除法,于是引入了分数概念。   但引入了除法之后,我们可以整数环基础上构造有理数域。   我们最常见域有理数域就是整数环基础上引入除法得到。   ...当然,对于我们有理数来说来说,这个周期无穷。如果域特征不为无穷,而为整数,实际上可以证明其只能为质数(Prime Number),这里不讲如何证明。   ...实际上,我们实数域、复数域有无穷多个子域。   比如集合 {x|x=a*√2 + b, a和b有理数} 加法、乘法上就是一个域。

44240

自然数到底可以表示到多大?

运算符号演化   我们最先学会运算符号加法,很快就学会了相同数连加。   ...高德纳箭头   提起高德纳Knuth,应该计算机界的人都知道吧,不用多介绍了。   他以连加、连乘、连乘方为思路基础,提出了高德纳箭头这样运算符。   ...葛立恒数   这是曾经出现在数学证明中最大自然数,不过后面被另外一个数学证明TREE(3)刷新纪录。这两个数都与图染色有关,此处不深入。   ...)) (else (knuth-list (cons (knuth-list (make-list (car lst) (cadr lst)) (- cnt_arrow 1)) (cddr lst...)) cnt_arrow)) ) ) (knuth-list (list m n) cnt_arrow) )   当然,上面只是表示出了其递归关系,现有宇宙下计算不出来^_^比如之前那6个2我们肯定就算不出来

1.3K20

日拱一卒,伯克利CS61A大作业,scheme 解释器(四)

这个二元list当中每个元素下标和值组合,如: 开发完成之后,进行测试: python3 ok -q 17 答案 lisp当中也有循环语法,如果使用循环会简单很多。...但问题,我们递归时候拿不到当前下标这个变量。所以进而可以想到,只有一个参数递归肯定是解决不了,我们至少需要两个参数。 不改动原有函数签名情况下,唯一办法就是使用高阶函数。...要实现cons-all函数,需要用到内置map过程。cons-all接收一个元素和一个list,将这个元素插入到list每个元素作为开头。...比如: 开发完成之后测试: python3 ok -q 18 答案 我们先来实现cons-all,这个函数逻辑并不复杂。 遍历rests每一个元素,然后将first元素拼接上去即可。...这样可以简化解释器开发,不太清楚这是否Lisp语言设计逻辑一部分,但它的确惊艳到了,这样设计思路实在太巧妙了。

94740
领券