我通常将自然数定义为:
data Nat : Set where
zero : Nat
succ : Nat → Nat
,即第一名应该是
one : Nat
one = succ zero
稍后,我们可以定义image数据类型
data Image_∋_ {A B : Set} (f : A → B) : B -> Set where
im : (x : A) → Image f ∋ (f x)
为了证明“我在继承函数的形象中的那个”,我写道:
one-succ : Image succ ∋ one
one-succ = im zero
我想有以下内容。
pred : Nat → Nat pred zero = zero pred (succ n) = n
答案 0 :(得分:6)
Image f ∋ y
读作“有x
个y ≡ f x
”。 Image f ∋ y
im x
上的模式匹配显示x
。
因此,Image succ ∋ 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
中的Image f ∋ y
是索引而不是参数,因此_·_
(以前为im
)现在接收两个参数:函数及其参数。无法对函数进行模式匹配,但.succ
是一种“无可辩驳的模式”,即它表示“f
可能无效,但succ
”。
Nat⁺
可以定义为
data Nat⁺ : Set where
nat⁺ : ∀ {n} → Image succ ∋ n → Nat⁺
succ⁺
会收到一个自然数字(隐式),并证明此数字的格式为succ m
m
。{/ p>
您始终可以使用正数自然数的前身:
pred⁺ : Nat⁺ → Nat
pred⁺ (nat⁺ (im m)) = m
但由于Nat⁺
是非索引的单构造函数数据类型,因此可以将其定义为记录:
record Nat⁺ : Set where
constructor nat⁺
field
{pred⁺} : Nat
image : Image succ ∋ pred⁺
open Nat⁺
open Nat⁺
在范围内引入了pred⁺ : Nat⁺ → Nat
。