我刚从阿格达(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)
我的问题是:
proof
和proof'
有什么区别?
为什么为ℕ
使用单个参数proof
是可以接受的?
为什么使用proof'
的三个构造函数不起作用?
奖金:
对idProof = proof' (λ z → z)
的工作方式(尤其是lambda)进行一些小小的解释将不胜感激,除非这可能超出了我目前对Agda的理解水平。
答案 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
选择了ℕ → ℕ
。