我是Agda的新手
顺便说一句,我怎么能用C-c C-n来评估列表相关函数,如反向?
我的意思是我怎么能像Haskell一样输入像[1,2,3]这样的列表,但它在agda中不起作用。
非常感谢
答案 0 :(得分:1)
"对于任何"是通用量化,它转化为依赖的函数类型。例如,让我们采用以下定理:对于任何大于零的自然数 n ,存在一个自然数 m ,这样S( m )= n 。
open import Data.Nat
open import Data.Product
open import Relation.Binary.PropositionalEquality
theorem : (n : ℕ) → 0 < n → Σ[ m ∈ ℕ ] (suc m ≡ n)
theorem zero ()
theorem (suc n) _ = n , refl
我们可以使用相同的模式重写你的定理:
theorem : {A B : Set} (f : A → B) {m n : ℕ} →
A has-size m → B has-size n → n < m →
Σ[ a ∈ A ] Σ[ a′ ∈ A ] (a ≢ a′ → f a ≡ f a′)
这涉及更多:对于任何集A
和B
,f
到A
的任何函数B
以及任何自然数{{} 1}}和m
,n
A
和m
有B
个元素,n
大于m
, n
中存在元素a
和a′
,即使A
与a
不同,a′
也等于f a
}。请注意,我剪切了f a′
元素;它仍然是相同的定理,但更容易写下来。
b
仍有待定义。我建议将_has-size_
定义为A has-size m
与A
同构的声明(Fin m
中可以找到Fin
)。如果您的假设Data.Fin
与A
和Fin m
同为B
同构,则可以对数字进行证明(这更容易),然后将这些数字转换回来属于Fin n
或A
的元素。
至于你的第二个问题:
B
回馈
C-c C-n reverse (1 ∷ 2 ∷ 3 ∷ [])
您可能尝试将列表编写为3 ∷ 2 ∷ 1 ∷ []
,就像在Haskell中一样,但这个快捷方式在Agda中不存在。聪明地使用运算符,你可能会使它有点工作,虽然它肯定需要更多的空格(例如[1, 2, 3]
),但我认为它不值得努力。 / p>