2016-06-30 3 views
4

Работая в Agda в течение последних нескольких месяцев, я просто столкнулся с блоком abstract в Агда, который предотвращает дальнейшую нормализацию термина за пределами области действия блока.Стандартная библиотека Agda - почему больше свойств не отмечено абстрактными?

Использование его для скрытия выработок моих лемм имеет значительно сократило время, необходимое для проверки типов моих программ. Просматривая стандартную библиотеку Agda, однако, abstract едва используется. Мне кажется, что почти все в любом файле Properties (например, Data.Nat.Properties) может находиться в блоке abstract, так как я не могу думать об использовании для рассуждений, например о том, как добавление оказывается коммутативным.

Является ли это абстрактным элементом новой функции, которая не попала в стандартную библиотеку? Или есть какая-то тонкость или недостаток маркировки доказательств abstract, что мне не хватает?

ответ

5

abstract для абстрактных вещей, он блокирует вычисление, так что если вы поместите доказательства в abstract блоке, вы не сможете использовать их в subst или 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 на module _ where, файл напечатает чек.

Андреас Абель wrote:

Я думаю, что это "абстрактный" особенность малопонятным. Мы должны планировать его для удаления, предоставляя льготный период, например, 5 лет. Если нет , у вас есть письменная техническая документация об этом до 2020 года с правильной семантикой и описанием ее предполагаемого взаимодействия с metas, мы ее отбрасываем.

+0

Спасибо, это имеет смысл! Но если есть (возможно) план отказаться от «абстрактного», есть ли альтернативная функция, предлагаемая для повышения производительности? Я понимаю, что абстракция через записи - это всегда хорошая идея, но в моем случае записи должны были бы быть огромными и могли бы отлично справиться с моим кодом, поскольку логически они будут вводиться только по соображениям производительности. – user2667523

+0

@ user2667523, я не знаю. В настоящее время вы можете использовать ['erase'] (https://github.com/agda/agda-stdlib/blob/f6212e49760a9fc2392b3d0889c8c7fc5e77634b/src/Relation/Binary/PropositionalEquality/TrustMe.agda#L25), если вы не хотите для вычисления дорогостоящих доказательств (и это не противоречит каноничности). – user3237465

+0

Может ли ['proof-reflevance'] (https://agda.github.io/agda-stdlib/Relation.Binary.PropositionalEquality.html#1420) использоваться в' zero'', чтобы обойти проблему с '+0 n' является абстрактным? – Cactus