首页 > 其他分享 >agda学习笔记——一些基础的整理

agda学习笔记——一些基础的整理

时间:2022-12-20 19:00:45浏览次数:40  
标签:Set suc 定义 笔记 证明 refl 等式 整理 agda

前言:又到了期末寄,开始匆忙整理下半学期学的agda,果然ddl就是第一生产力,这个交互式证明工具还是挺有意思的虽然有的时候很蠢

Agda是基于Haskell的,所以很多语法和Haskell几乎一致

没有快捷键不会用系列

待补充的地方加问号

C-c C-l : 加载,把问号转换成goal

C-c C-, : goal&context

C-c C-. : goal&context&type

C-c C-r : refine

C-c C-c spilt:


一些框架和理论基础

命题通常是由等式来表示和进行推导(等式理论)

变量和命题都是Set,即一个集合中的元素,Set有等级,表示包含关系


一些语法:大致与haskell相似

{}中的是隐含变量,不一定需要在定义或调用中给出,可由参数推出即可

类型需要声明{A : Set}或者{l} {A : Set l}

要使用变量需要声明类型:(x : A)来声明一个A类型的变量


最基本的等式:refl,反身性,表示等式左右两边全等,即形式可化为完全相同

若所证明的等式to-prove-p已经化为左右全等,则只需写 to-prove-p = refl

如果需要利用别的已知等式p来替换,需要使用rewrite p,表示在要证明的命题中把包含的所有等式p左边的内容换成右边的内容再进行推导


Natural和List的定义都是递归定义的,包括他们的运算

在证明时能直接用的东西只有定义,并且是严格按照定义来(逻辑还是很严谨的,甚至有些过分严谨了)

证明通常是把变量利用递归定义的方式分解为子问题,利用归纳解决


写一个命题需要考虑所有的情况,比如Natural定义中的zero和suc n

一个例子:证明加法结合律

+assoc : (x y z : ℕ) → x + (y + z) ≡ (x + y) + z
+assoc 0 y z = refl
+assoc (suc x) y z rewrite +assoc x y z = refl

也可利用等式理论书写,将左边的式子一步步化为右边的

比用rewrite麻烦,但是在复杂的证明中逻辑更清晰,最后的\qed也显得很爽

语法规则大概是用"≡⟨⟩"来衔接推导,"⟨⟩"里可以不写,表示由定义得到,也可以写这一步的依据

依据的格式大概如下

cong f (x ≡ y) 表示把式子中被f函数包裹的x替换成y

cong-app (∀ x -> f x ≡ g x) f x ≡ g x,表示f和g相同则把f x替换为g x

+-suc : (m n : ℕ) → m + suc n ≡ suc (m + n)
+-suc 0 n = refl
+-suc (suc m) n =
  begin 
    suc m + suc n
  ≡⟨⟩ 
    suc (m + suc n)
  ≡⟨ cong suc (+-suc m n) ⟩
    suc (suc m + n) 
  ∎

Internal Verification

大概就是把一些性质的证明包含在函数定义或类型定义里


基础内容就整理到这里,还有一些进阶的玩法就不赘述了(其实是没学)

但我们已经可以利用它来推导证明接下来的一些计算理论了

标签:Set,suc,定义,笔记,证明,refl,等式,整理,agda
From: https://www.cnblogs.com/deaf/p/16994899.html

相关文章

  • Markdown 使用笔记
    使用<font>标签的修改字体这里是默认字体这里是黑体这里是楷体这里是宋体使用<font>标签的修改字号这里是默认正文字号1号字最小2号字3号字默认4号字5号......
  • .NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构一)--学习笔记
    目录为什么我们用OrleansDaprVSOrleansActor模型Orleans的核心概念为什么我们用Orleans分布式系统开发、测试的难度(服务发现、通信)运维的复杂度(伸缩性与可靠性的保障)a......
  • 综合方法selenium整理
    1.1  下载selenium2.0的包官方download包地址:​​http://code.google.com/p/selenium/downloads/list​​官方UserGuide: ​​http://seleniumhq.org/docs/​​官......
  • Docker学习笔记十三:Docker安装Prometheus
    介绍Prometheus介绍是一款基于时序数据库的开源监控告警系统,非常适合Kubernetes集群的监控。基本原理是通过HTTP协议周期性抓取被监控组件的状态,任意组件只要提供对应......
  • 自动化测试技术笔记(二):准备工作的切入点
    上篇整理的技术笔记,聊了自动化测试的前期调研工作如何开展,最后一部分也提到了工作的优先级区分。这篇文章,接上篇文章的内容,来聊聊自动化测试前期的准备工作,需要考虑哪些......
  • 嵌入式软件设计---笔记
    嵌入式软件设计---笔记​​1.1引言​​​​1.1.1嵌入式系统基本概念​​​​1.1.2嵌入式系统举例​​​​1.1.3嵌入式系统的特点​​​​1.1.4嵌入式操作系统体系结构......
  • .NET 云原生架构师训练营(基于 OP Storming 和 Actor 的大型分布式架构一)--学习笔记
    目录为什么我们用OrleansDaprVSOrleansActor模型Orleans的核心概念为什么我们用Orleans分布式系统开发、测试的难度(服务发现、通信)运维的复杂度(伸缩性与可靠性的保障)a......
  • Zookeeper学习笔记
    1.简介1)简介Zookeeper,为分布式框架提供协调服务,基于观察者模式。负责存储管理大家关心的数据,接受观察者的注册,当数据状态发生变化,Zookeeper负责同志在Zookeeper上注册的......
  • Python学习笔记--元组+字符串
    元组元组一旦定义完成,就不能再被修改同样,元组也可以进行嵌套操作当然,若是在元组里面嵌套一个list,那么list里面的元素是可以进行修改的!案例:实现:字符串查找索......
  • 2022.12.20 线段树复习笔记(未完待续)
    线段树原理及存储:如图,1即为根节点,存储着[1,5]的整个区间和,‘1’为左边界,‘5’为右边界,所以此节点表示的是[1,5]这个区间。线段树的每个节点向下二分,左儿子的编号为此节......