Agda学习笔记1

好久没写博客了,诈尸一波。

说句题外话,期中有点小爆炸,开始后悔选实验班了。要读信科的后辈诸君,我劝你选计概A普通班拿4.0。

开学的时候老是想着多学点东西,现在:绩点绩点绩点

快捷键

  • C-c C-l : 加载,把问号转换成goal
  • C-c C-f/C-b : 在goal之间切换
  • C-c C-, : goal&context
  • C-c C-. : goal&context&type
  • C-c C-r : refine 有时可以自动填充
  • C-c C-c spilt:
    • 直接回车:补上变量
    • 输入变量:把这个变量解释成所有定义
  • C-c C-a : 自动填充(一般用不上)

refl

表示左右相等

Natural Number

自然数集合

data \(ℕ\) : Set where

zero : \(ℕ\)

suc : \(ℕ \rightarrow ℕ\)

即只能从这两条推出其他的性质

解释一个 ℕ 变量的时候就会展开成这两个元素

operations

  1. \(\_+\_ : ℕ → ℕ → ℕ\)

    zero + n = n

    suc m + n = suc (m + n)

  2. \(\_*\_ : ℕ → ℕ → ℕ\)

    zero * n = zero

    suc m * n = n + (m * n)

  3. \(pred : ℕ → ℕ\)

    pred 0 = 0

    pred (suc n) = n

rewrite

大概是用于递归的一个东西,相当于把rewrite的东西带入原式

cong

cong f : 把 f 添加到左右两边

例:

  1. +0 : (y : ℕ) -> y y + zero
  2. +0 zero = refl
  3. +0 (suc y) = cong suc (+0 y)

加法结合律

  1. +assoc : (x y z : ℕ) x + (y + z) (x + y) + z
  2. +assoc zero y z = refl
  3. +assoc (suc x) y z rewrite +assoc x y z = refl

就是运用suc对+的结合律

加法交换律

依旧是利用suc递归...

  1. +suc : (x y : ℕ) suc x + y x + suc y
  2. +suc zero y = refl
  3. +suc (suc x) y rewrite +suc x y = refl
  4. +comm : (x y : ℕ) x + y y + x
  5. +comm zero y = +0 y
  6. +comm (suc x) y rewrite +comm x y = +suc y x

也可以用rewrite这样写:

  1. +comm : (x y : ℕ) x + y y + x
  2. +comm zero y = +0 y
  3. +comm (suc x) y rewrite +comm x y | +suc y x = refl

rewrite加竖线就是从左到右替换

乘法分配律

同上

  1. *distribr : (x y z : ℕ) (x + y) * z x * z + y * z
  2. *distribr zero y z = refl
  3. *distribr (suc x) y z rewrite *distribr x y z | +assoc z (x * z) (y * z) = refl

比较大小

  1. _<_ :
  2. 0 < 0 = ff
  3. 0 < (suc y) = tt
  4. (suc x) < (suc y) = x < y
  5. (suc x) < 0 = ff
  6. _=ℕ_ :
  7. 0 =ℕ 0 = tt
  8. suc x =ℕ suc y = x =ℕ y
  9. _ =ℕ _ = ff
  10. __ :
  11. x y = (x < y) || x =ℕ y
  12. _>_ :
  13. a > b = b < a
  14. __ :
  15. a b = b a

注意相等是 _=ℕ_

衍生的一些证明

其实上面的定义不用记,反正也会忘

写作业和考试前看看就好了

  1. <-0 : ∀ (x : ℕ) → x < 0 ≡ false
  2. <-0 0 = refl
  3. <-0 (suc y) = refl
  1. -contra : false true ∀{ℓ} {P : Set ℓ} P
  2. -contra ()
  3. <-trans : {x y z : ℕ} x < y true y < z true x < z true
  4. <-trans {x} {0} p1 p2 rewrite <-0 x = -contra p1
  5. <-trans {0} {suc y} {0} p1 ()
  6. <-trans {0} {suc y} {suc z} p1 p2 = refl
  7. <-trans {suc x} {suc y} {0} p1 ()
  8. <-trans {suc x} {suc y} {suc z} p1 p2 = <-trans {x} {y} {z} p1 p2

其中 () 代表荒谬匹配,即出现 false==true 时就可以直接写 (),也可以像第一条一样,用大括号加上(必要的)参数之后用定义的 -contra(有点搞不懂原理)

  1. =ℕ-refl : (x : ℕ) (x =ℕ x) tt
  2. =ℕ-refl 0 = refl
  3. =ℕ-refl (suc x) = =ℕ-refl x
  4. =ℕ-from-≡ : {x y : ℕ} x y x =ℕ y tt
  5. =ℕ-from-≡ {x} refl = =ℕ-refl x

也可以用 refl 替换一个等式

begin-qed

一种语法,如下:

  1. +0 : (y : ℕ) -> y y + zero
  2. +0 zero = refl
  3. +0 (suc y) =
  4. begin
  5. suc y
  6. ≡⟨ cong suc (+0 y)
  7. suc (y + zero)
  8. ≡⟨⟩
  9. suc y + zero

<>里的是依据,某些根据定义的依据可以不用写(如zero+x=x)

作业题

乘法交换律

惨淡的证明:

  1. +assoc' : ∀ (x y z : ℕ) → (x + y) + z ≡ x + (y + z)
  2. +assoc' x y z rewrite +assoc x y z = refl
  3. *0 : (x : ℕ) zero x * zero
  4. *0 zero = refl
  5. *0 (suc x) = *0 x
  6. *suc : (x y : ℕ) x + x * y x * suc y
  7. *suc zero y = refl
  8. *suc (suc x) y rewrite +assoc x y (x * y) | +comm x y | +assoc' y x (x * y) | *suc x y = refl
  9. *-comm : (x y : ℕ) → x * y ≡ y * x
  10. *-comm zero zero = refl
  11. *-comm zero (suc y) = *-comm zero y
  12. *-comm (suc x) y rewrite *-comm x y = *suc y x

优化:使用 sym x == y -> y == x,即把+assoc' y x (x * y) 换成 sym ( +assoc y x (x * y) )

乘法结合律

精简的证明:

  1. *-assoc : (x y z : ℕ) (x * y) * z x * (y * z)
  2. *-assoc zero y z = refl
  3. *-assoc (suc x) y z rewrite *distribr y (x * y) z | *-assoc x y z = refl

一些比较大小

  1. nn : (n : ℕ) n < n false
  2. nn zero = refl
  3. nn (suc x) = nn x
  4. -- problem 2.2
  5. <-antisym : (x y : ℕ) x < y true y < x false
  6. <-antisym zero (suc y) p1 = refl
  7. <-antisym (suc x) (suc y) = <-antisym x y
  8. -- problem 2.3
  9. <-trichotomy : (x y : ℕ) x < y x =ℕ y y < x true
  10. <-trichotomy zero zero = refl
  11. <-trichotomy zero (suc y) = refl
  12. <-trichotomy (suc x) zero = refl
  13. <-trichotomy (suc x) (suc y) = <-trichotomy x y

Agda学习笔记1的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  3. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

  4. 2014年暑假c#学习笔记目录

    2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...

  5. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  6. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  7. CSS学习笔记

    CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...

  8. HTML学习笔记

    HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...

  9. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

随机推荐

  1. [CF1539F] Strange Array (线段树)

    题面 有一个长度为 n \tt n n 的序列 a \tt a a ,对于每一个位置 i ∈ [ 1 , n ] \tt i\in[1,n] i∈[1,n]: 选择一个区间 [ l , r ] \tt ...

  2. FFT快速傅立叶变换:解析wav波频图、Time Domain、Frequency Domain

    您好,此教程将教大家使用scipy.fft分析wav文件的波频图.Time Domain.Frequency Domain. 实际案例:声音降噪,去除高频. 结果: 波频图: Time Domain:

  3. VS Code C++ 代码格式化(clang-format)

    --- # 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto Language: Cpp # BasedOnStyle ...

  4. KDB_Database_Link 使用介绍

    kdb_database_link 是 KingbaseES 为了兼容oracle 语法而开发的跨数据库访问扩展,可用于访问KingbaseES, Postgresql , Oracle .以下分别介 ...

  5. LFS(Linux From Scratch)构建过程全记录(一):准备工作

    写在前面 本人修学了一门课,名曰<操作系统课程设计>,其任务为基于LFS以编译源代码的方式制作一个基本的Linux操作系统,并且编写在linux下的GUI软件. 本操作系统构建的全过程将分 ...

  6. 数据仓库与hive

    数据仓库与hive hive--数据仓库建模工具之一 一.数据库.数据仓库 1.1 数据库 关系数据库本质上是一个二元关系,说的简单一些,就是一个二维表格,对普通人来说,最简单的理解就是一个Excel ...

  7. Django 聚合查询 分组查询 F与Q查询

    一.聚合查询 需要导入模块:from django.db.models import Max, Min, Sum, Count, Avg 关键语法:aggregate(聚合结果别名 = 聚合函数(参数 ...

  8. shell分割字符串并赋值给变量

    假如变量var的值为:num=12,也即var="num=12",现在想把 12赋值给变量id awk 的-F 后跟上要分割字符串时的指定分隔符 awk中$0是要分割的字符串,$1 ...

  9. Jhipster自动生成实体类等文件

    官网:https://www.jhipster.tech/cn/ 准备工作 安装node(npm) 准备jdl文件 安装Jhipster:npm install -g generator-jhipst ...

  10. C++ 中std::的使用

    std是一个类(输入输出标准),它包括了cin成员和cout成员,using name space std ;以后才能使用它的成员.#include<iostream.h>中不存在类std ...