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
      by
      im 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
      是一个索引而不是一个参数,因此
      (以前的
      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⁺