过去几个月一直在Agda工作,我刚刚遇到Agda的abstract
区块,这阻止了该区域范围以外的进一步规范化。
使用它隐藏我的lemmas的工作方式极大地减少了对我的程序进行类型检查所需的时间。浏览Agda标准库但是abstract
几乎没有使用。在我看来,任何Properties
文件中的所有内容(例如Data.Nat.Properties
)都可以在abstract
块内,因为我无法想到用于推理的用法,例如,如何证明加法是可交换的。
这是抽象的一个新功能还没有进入标准库的情况吗?或者是否有一些我遗漏的标记abstract
的微妙或缺点?
答案 0 :(得分:5)
abstract
用于抽象事物,它会阻止计算,因此如果您将证据放在abstract
块中,您将无法在subst
或{{1}中使用它们同时仍保留正规性:
rewrite
即。 module _ where
open import Function
open import Relation.Binary.PropositionalEquality
open import Data.Nat.Base
open import Data.Fin hiding (_+_)
abstract
+0 : ∀ n -> n + 0 ≡ n
+0 0 = refl
+0 (suc n) = cong suc (+0 n)
zero′ : ∀ n -> Fin (suc n + 0)
zero′ n = subst (Fin ∘ suc) (sym (+0 n)) zero
fail : zero′ 2 ≡ zero
fail = refl
-- subst ((λ {.x} → Fin) ∘ suc) (sym (+0 2)) zero != zero of type Fin (suc 2 + 0)
-- when checking that the expression refl has type zero′ 2 ≡ zero
块与abstract
块具有相同的效果。
如果您将postulate
替换为abstract
,则该文件将键入check。
Andreas Abel wrote:
我认为这种“抽象”功能很少被人理解。我们应该 安排将其移除,给予5年的宽限期。如果不 一个人写了一篇关于它的技术论文,直到2020年 适当的语义和与...的预期交互的描述 metas,我们放弃它。