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

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


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

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

posted @ 2022-12-20 18:51  deaf  阅读(332)  评论(0编辑  收藏  举报