关于succ函数的图像

时间:2016-12-05 21:37:27

标签: agda

我通常将自然数定义为:

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
  • 我希望有一个名为Z⁺的变量代表正数但在其定义中使用后继函数的图像(上面定义的Image_∋_数据类型)。

1 个答案:

答案 0 :(得分:6)

Image f ∋ y读作“有xy ≡ 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 msucc 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