Agda中的证明以及如何在C-c C-n中评估基于列表的函数

时间:2014-04-28 16:58:57

标签: agda

我是Agda的新手

顺便说一句,我怎么能用C-c C-n来评估列表相关函数,如反向?

我的意思是我怎么能像Haskell一样输入像[1,2,3]这样的列表,但它在agda中不起作用。

非常感谢

1 个答案:

答案 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′)

这涉及更多:对于任何集ABfA的任何函数B以及任何自然数{{} 1}}和mn AmB个元素,n大于mn中存在元素aa′,即使Aa不同,a′也等于f a }。请注意,我剪切了f a′元素;它仍然是相同的定理,但更容易写下来。

b仍有待定义。我建议将_has-size_定义为A has-size mA同构的声明(Fin m中可以找到Fin)。如果您的假设Data.FinAFin m同为B同构,则可以对数字进行证明(这更容易),然后将这些数字转换回来属于Fin nA的元素。


至于你的第二个问题:

B

回馈

C-c C-n reverse (1 ∷ 2 ∷ 3 ∷ [])

您可能尝试将列表编写为3 ∷ 2 ∷ 1 ∷ [] ,就像在Haskell中一样,但这个快捷方式在Agda中不存在。聪明地使用运算符,你可能会使它有点工作,虽然它肯定需要更多的空格(例如[1, 2, 3]),但我认为它不值得努力。 / p>