在Agda中使用隐式参数

时间:2018-07-02 11:04:32

标签: types proof agda

我刚从阿格达(Agda)开始,并一直遵循LearnYouAnAgda tutorial,其中向我展示了这一身份证明:

proof : (A : Set) → A → A
proof _ x = x

据我了解,_是省略参数(A : Set)所必需的。我想使用一个隐式参数来允许我省略_

-- using implicit parameter
proof' : {A : Set} → A → A
proof' x = x

此证明有效。然后,我想将其应用于特定情况,如本教程中所述。我定义并为我要证明的内容提供类型签名:

data ℕ : Set where
  zero : ℕ
  suc : ℕ → ℕ

idProof : ℕ → ℕ

本教程中使用proof给出的构造函数为:

idProof = proof ℕ

我对此并不完全了解,因为考虑到我们已经定义的构造函数,我希望proof需要2个参数。

我想用proof'写一个构造函数,但发现以下任何一项都不起作用:

idProof = proof' ℕ
idProof = {x : ℕ} → proof' x
idProof = {x : Set} → proof' x

使用求解器,但是我发现这可行:

idProof = proof' (λ z → z)

我的问题是:

  1. proofproof'有什么区别?

  2. 为什么为使用单个参数proof是可以接受的?

  3. 为什么使用proof'的三个构造函数不起作用?

奖金:

idProof = proof' (λ z → z)的工作方式(尤其是lambda)进行一些小小的解释将不胜感激,除非这可能超出了我目前对Agda的理解水平。

1 个答案:

答案 0 :(得分:0)

  

我不太了解这一点,因为考虑到我们已经定义的构造函数,我希望proof需要2个参数。

proof确实需要2个参数。但是idProof也需要一个参数。

写作时

idProof : ℕ → ℕ
idProof = proof ℕ

这等同于首先引入idProof的{​​{1}},然后将其传递给

proof ℕ
  

我想使用证明来编写构造函数”,但发现以下任何一项均无效:

  • idProof : ℕ → ℕ idProof n = proof ℕ n

idProof = proof' ℕ的{​​{1}}参数是隐式的。因此,无需显式传递A。您只需编写proof',然后让Agda找出应该是idProof = proof'

  • A

idProof = {x : ℕ} → proof' x类型为idProof = {x : Set} → proof' x,但是idProof用于构造ℕ → ℕ,而不是构造函数,因此它无法工作。

  

奖金:关于{x : _} → ...的工作原理的简短说明(尤其是lambda)

Set试图根据其参数和所使用的孔的类型来确定idProof = proof' (λ z → z)应该是什么。这里:

  • 它传递了一个标识函数,因此proof' : {A : Set} -> A -> A对于某些A应该具有A的形状;
  • 它用于B -> B类型的孔中,因此B的形状应为ℕ → ℕ

结论:Agda为A选择了ℕ → ℕ