Agda:Stdlib的矢量会员? (以及如何一般地学习stdlib)

时间:2017-03-06 19:05:18

标签: vector functional-programming proof agda dependent-type

我正在处理Agda中的字符串,而且我有一个它们的向量。我需要检查一个给定的字符串是否出现在一个向量中(作为检查变量是否空闲或绑定在表达式中的一部分,在PL理论中我是做什么的。)

我仍然在标准库中找到自己的方式,而且我发现我花了很多时间寻找其他语言标准库中的基本功能(哈斯克尔等)。学习语言及其概念有很多宝贵的资源,但我在Agda,公共图书馆等应用编程方面所见的并不多。

  1. 标准库中是否有Vector的隶属函数,或构建一个简单的单行,或者我是否需要自己编写函数? (显然,这样的函数将参数化为元素类型的可判定等式)

  2. 您如何在Agda中学习标准库?是否有良好的指南/教程,或类似类似工具的工具?

1 个答案:

答案 0 :(得分:4)

  

标准库中是否有Vector的隶属函数,或构建一个简单的单行,或者我是否需要自己编写函数?

不是我知道的。 right notions在那里但不是搜索功能AFAICT。并且使用我在其余答案中描述的命令不会产生任何结果。

  

您如何在Agda中学习标准库?是否有良好的指南/教程,或类似hoogle的工具?

在emacs内部,您可以使用C-c C-z搜索范围内的定义。您可以使用两个标识符(它将选择类型提及它们的定义)和字符串文字(它将选择标识符包含该字符串的标识符)。

因此,探索图书馆的一种方法是open import许多模块,并在精心挑选的关键字上使用C-c C-z。例如。在以下模块中

module Explore where

open import Data.Nat
open import Data.Nat.Divisibility
open import Data.Nat.Properties
open import Data.Nat.Properties.Simple

按键C-c C-z _*_ _+_ RET返回:

Definitions about _*_, _+_
  +-*-suc : (m n : ℕ) → m * suc n .Agda.Builtin.Equality.≡ m + m * n
  /-cong  : {i j : ℕ} (k : ℕ) → i + k * i ∣ j + k * j → i ∣ j
  distribʳ-*-+
          : (m n o : ℕ) → (n + o) * m .Agda.Builtin.Equality.≡ n * m + o * m
  im≡jm+n⇒[i∸j]m≡n
          : (i j m n : ℕ) →
            i * m .Agda.Builtin.Equality.≡ j * m + n →
            (i ∸ j) * m .Agda.Builtin.Equality.≡ n
  isCommutativeSemiring
          : .Algebra.Structures.IsCommutativeSemiring
            .Agda.Builtin.Equality._≡_ _+_ _*_ 0 1
  nonZeroDivisor-lemma
          : (m q : ℕ) (r : .Data.Fin.Fin (suc m)) →
            .Data.Fin.toℕ r .Relation.Binary.Core.≢ 0 →
            suc m ∣ .Data.Fin.toℕ r + q * suc m → .Data.Empty.⊥