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 添加到左右两边

例:

+0 : ∀ (y : ℕ) -> y ≡ y + zero
+0 zero = refl
+0 (suc y) = cong suc (+0 y)

加法结合律

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

就是运用suc对+的结合律

加法交换律

依旧是利用suc递归...

+suc : ∀ (x y : ℕ) → suc x + y ≡ x + suc y
+suc zero y = refl
+suc (suc x) y rewrite +suc x y = refl +comm : ∀ (x y : ℕ) → x + y ≡ y + x
+comm zero y = +0 y
+comm (suc x) y rewrite +comm x y = +suc y x

也可以用rewrite这样写:

+comm : ∀ (x y : ℕ) → x + y ≡ y + x
+comm zero y = +0 y
+comm (suc x) y rewrite +comm x y | +suc y x = refl

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

乘法分配律

同上

*distribr : ∀ (x y z : ℕ) → (x + y) * z ≡ x * z + y * z
*distribr zero y z = refl
*distribr (suc x) y z rewrite *distribr x y z | +assoc z (x * z) (y * z) = refl

比较大小

_<_ : ℕ → ℕ →
0 < 0 = ff
0 < (suc y) = tt
(suc x) < (suc y) = x < y
(suc x) < 0 = ff
_=ℕ_ : ℕ → ℕ →
0 =ℕ 0 = tt
suc x =ℕ suc y = x =ℕ y
_ =ℕ _ = ff
_≤_ : ℕ → ℕ →
x ≤ y = (x < y) || x =ℕ y
_>_ : ℕ → ℕ →
a > b = b < a
_≥_ : ℕ → ℕ →
a ≥ b = b ≤ a

注意相等是 _=ℕ_

衍生的一些证明

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

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

<-0 : ∀ (x : ℕ) → x < 0 ≡ false
<-0 0 = refl
<-0 (suc y) = refl
-contra : false ≡ true → ∀{ℓ} {P : Set ℓ} → P
-contra () <-trans : ∀ {x y z : ℕ} → x < y ≡ true → y < z ≡ true → x < z ≡ true
<-trans {x} {0} p1 p2 rewrite <-0 x = -contra p1
<-trans {0} {suc y} {0} p1 ()
<-trans {0} {suc y} {suc z} p1 p2 = refl
<-trans {suc x} {suc y} {0} p1 ()
<-trans {suc x} {suc y} {suc z} p1 p2 = <-trans {x} {y} {z} p1 p2

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

=ℕ-refl : ∀ (x : ℕ) → (x =ℕ x) ≡ tt
=ℕ-refl 0 = refl
=ℕ-refl (suc x) = =ℕ-refl x =ℕ-from-≡ : ∀ {x y : ℕ} → x ≡ y → x =ℕ y ≡ tt
=ℕ-from-≡ {x} refl = =ℕ-refl x

也可以用 refl 替换一个等式

begin-qed

一种语法,如下:

+0 : ∀ (y : ℕ) -> y ≡ y + zero
+0 zero = refl
+0 (suc y) =
begin
suc y
≡⟨ cong suc (+0 y) ⟩
suc (y + zero)
≡⟨⟩
suc y + zero

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

作业题

乘法交换律

惨淡的证明:

+assoc' : ∀ (x y z : ℕ) → (x + y) + z ≡ x + (y + z)
+assoc' x y z rewrite +assoc x y z = refl *0 : ∀ (x : ℕ) → zero ≡ x * zero
*0 zero = refl
*0 (suc x) = *0 x *suc : (x y : ℕ) → x + x * y ≡ x * suc y
*suc zero y = refl
*suc (suc x) y rewrite +assoc x y (x * y) | +comm x y | +assoc' y x (x * y) | *suc x y = refl *-comm : (x y : ℕ) → x * y ≡ y * x
*-comm zero zero = refl
*-comm zero (suc y) = *-comm zero y
*-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) )

乘法结合律

精简的证明:

*-assoc : (x y z : ℕ) → (x * y) * z ≡ x * (y * z)
*-assoc zero y z = refl
*-assoc (suc x) y z rewrite *distribr y (x * y) z | *-assoc x y z = refl

一些比较大小

n≮n : (n : ℕ) → n < n ≡ false
n≮n zero = refl
n≮n (suc x) = n≮n x -- problem 2.2
<-antisym : (x y : ℕ) → x < y ≡ true → y < x ≡ false
<-antisym zero (suc y) p1 = refl
<-antisym (suc x) (suc y) = <-antisym x y -- problem 2.3
<-trichotomy : (x y : ℕ) → x < y ∨ x =ℕ y ∨ y < x ≡ true
<-trichotomy zero zero = refl
<-trichotomy zero (suc y) = refl
<-trichotomy (suc x) zero = refl
<-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. RabbitMQ 入门系列:2、基础含义理解:链接、通道、队列、交换机

    系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...

  2. 记一次有意思的 SQL 实现 → 分组后取每组的第一条记录

    开心一刻 今天,朋友气冲冲的走到我面前 朋友:我不是谈了个女朋友,谈了三个月嘛,昨天我偷看她手机,你猜她给我备注什么 我:备注什么? 朋友:舔狗 2 号! 我一听,气就上来了,说道:走,找她去,这婆娘 ...

  3. QtCreator使用AStyle配置VS默认编辑代码风格

    基础配置和下载 基础配置和下载,随便找一个教程就行 下面贴出我的配置 --style=allman indent=spaces=4 indent-switches indent-preproc-blo ...

  4. SpringMVC 06: 日期类型的变量的注入和显示

    日期处理和日期显示 日期处理 此时SpringMVC的项目配置和SpringMVC博客集中(指SpringMVC 02)配置相同 日期处理分为单个日期处理和类中全局日期处理 单个日期处理: 使用@Da ...

  5. js函数( 普通函数、箭头函数 ) 内部this的指向

    - 普通函数   | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...

  6. multiprocessing 让子进程忽略信号,手动关闭子进程

    起因 同事想要写一个代码,主进程中监听SIGINT.SIGTERM信号退出,并关闭启动的子进程,代码类似这样 import signal import sys import time from mul ...

  7. KingbaseES V8R3 集群专用机网关失败分析案例

    ​ KingbaseES R3集群网关检测工作机制: 1.Cluster下watchdog进程在固定间隔时间,通过ping 网关地址监控链路的连通性,如果连通网关地址失败,则修改cluster sta ...

  8. KingbaseES 表空间加密-透明加密

    透明存储加密是指数据在写到磁盘上时对其进行加密,当授权用户重新读取数据时再对其进行解密.加密解密过程对用户都是透明的,无需对应用程序进行修改,授权用户甚至不会注意到数据已经在存储介质上加密.当前的透明 ...

  9. KingbaseES 如何开启并进入数据库

    关键字: KingbaseES.sys_ctl.ksql 一.数据库启动前环境检测 1.1 查看kingbase用户环境变量配置 图1-1 查看.bashrc环境变量配置 1.2 应用环境变量 [ki ...

  10. AD画板从头开始

    AD画板从头开始 前言 近期认真的画了一次板子,以前虽然也画过,但是都是很随意的,这次是做一个小项目,然后因为有一段时间没有画板了,发现自己很多基础的东西都忘记了,这里就来记录一下从头到尾的过程.本次 ...