如何在agda中定义抽象类型

时间:2014-11-12 13:46:45

标签: isabelle agda

如何在Agda中定义抽象类型。我们在Isabelle中使用 typedecl 来执行此操作。

更确切地说,我想在Isabelle中使用以下代码的agda对应部分:

typedecl A

由于

1 个答案:

答案 0 :(得分:7)

您可以使用参数化模块。让我们来看一个例子:我们首先介绍一个记录Nats打包Set以及操作。

record Nats : Set₁ where
  field
    Nat     : Set
    zero    : Nat
    succ    : Nat → Nat
    primrec : {B : Set} (z : B) (s : Nat → B → B) → Nat → B

然后我们可以定义一个由这种结构参数化的模块。加法和乘法可以用原始递归,零和后继来定义。

open import Function
module AbstractType (nats : Nats) where

  open Nats nats

  add : Nat → Nat → Nat
  add m n = primrec n (const succ) m

  mult : Nat → Nat → Nat
  mult m n = primrec zero (const (add n)) m

最后,我们可以提供Nats的实例。在这里,我重用标准库中定义的自然数,但例如可以使用二进制数。

open Nats
Natsℕ : Nats
Natsℕ = record { Nat     = ℕ
               ; zero    = 0
               ; succ    = suc
               ; primrec = primrecℕ }
  where
    open import Data.Nat
    primrecℕ : {B : Set} (z : B) (s : ℕ → B → B) → ℕ → B
    primrecℕ z s zero    = z
    primrecℕ z s (suc n) = s n $ primrecℕ z s n

将此实例传递给模块,为我们提供相应的add / mult操作:

open import Relation.Binary.PropositionalEquality

example :
  let open AbstractType Natsℕ
  in mult (add 0 3) 3 ≡ 9
example = refl