Agda 关于succ函数的映像
我通常将自然数定义为:Agda 关于succ函数的映像,agda,Agda,我通常将自然数定义为: data Nat : Set where zero : Nat succ : Nat → Nat 也就是说,第一个应该是 one : Nat one = succ zero 稍后,我们可以定义图像数据类型 data Image_∋_ {A B : Set} (f : A → B) : B -> Set where im : (x : A) → Image f ∋ (f x) 为了证明类似“一是后续函数的形象”的东西,我写道: 我想要以下的 定义
data Nat : Set where
zero : Nat
succ : Nat → Nat
也就是说,第一个应该是
one : Nat
one = succ zero
稍后,我们可以定义图像数据类型
data Image_∋_ {A B : Set} (f : A → B) : B -> Set where
im : (x : A) → Image f ∋ (f x)
为了证明类似“一是后续函数的形象”的东西,我写道:
我想要以下的
- 定义不允许零作为输入的前置函数及其后续函数。所以下一个是无效的
- 我想要一个叫做Z的变量⁺ 表示正数,但在其定义中使用后继函数的图像(图像_∋_ 上面定义的数据类型)
图像f∋ y
读作“有一些x
这样y≡ f x
”。图像f上的模式匹配∋ y
byim x
显示x
因此,类型为Image succi的元素∋ n
证明n
的形式为succ m
,其中m
携带在该元素中。因此,定义很简单
ipred : ∀ {n} → Image succ ∋ n → Nat
ipred (im m) = m
因为n≡ succ m
和succ m
的前身是m
如果我们将im
重命名为isucc
,读起来会更好:
open Image_∋_ renaming (im to isucc)
ipred : ∀ {n} → Image succ ∋ n → Nat
ipred (isucc m) = m
写同样东西的另一种方式是
data Image_∋_ {A B : Set} : (A → B) → B → Set where
_·_ : (f : A → B) → (x : A) → Image f ∋ f x
pred : ∀ {n} → Image succ ∋ n → Nat
pred (.succ · m) = m
这里f
在图像f中∋ y
是一个索引而不是一个参数,因此u·
(以前的im
)现在接收两个参数:一个函数和它的参数。不可能在函数上进行模式匹配,但是。succ
是一种“无可辩驳的模式”,即它说“f
可以是零,但succ
”
Nat⁺代码>可以定义为
data Nat⁺ : Set where
nat⁺ : ∀ {n} → Image succ ∋ n → Nat⁺
成功⁺
接收一个自然数(隐式)和一个证明,对于某些m
,该数字的形式为succ m
您始终可以使用正自然数的前导:
pred⁺ : Nat⁺ → Nat
pred⁺ (nat⁺ (im m)) = m
但是由于Nat⁺
是一种非索引单构造函数数据类型,可以定义为记录:
record Nat⁺ : Set where
constructor nat⁺
field
{pred⁺} : Nat
image : Image succ ∋ pred⁺
open Nat⁺
打开Nat⁺代码>介绍pred⁺ : 纳特⁺ → Nat
在范围内。您的意思是pred
的类型应该是∀ {n}→ 图像成功∋ N→ 纳特
?是的,类似的事情……这正是我所想的。在nat+定义中,还有一个问题是\forall的必要使用,或者仅仅是编写{n:nat}的语法糖?@jonaprieto,它只是糖。注意∀ {n}
不是{n:Nat}
的语法糖,因为省略了类型信息,即∀ {n}
是{n:}
的语法糖。请参阅文档。asr,我确实应该澄清这一点。谢谢@jonaprieto,请看看asr写了什么。
pred⁺ : Nat⁺ → Nat
pred⁺ (nat⁺ (im m)) = m
record Nat⁺ : Set where
constructor nat⁺
field
{pred⁺} : Nat
image : Image succ ∋ pred⁺
open Nat⁺