Agda, абсурд в образцах
Nov. 26th, 2012 02:09 amОказывается, абсурдный образец не обязателен (хотя и часто полезен) при отсутствии допустимых образцов конструктора:
С каноническим примером такое не пройдёт
module AbsurdTest where data False : Set where -- необитаемый record True : Set where -- синглетон data Bool : Set where true : Bool false : Bool -- декодирующая функция для булева универсума isTrue : Bool → Set isTrue true = True isTrue false = False not_ : Bool → Bool not true = false not false = true -- абсурдистская версия lem-not²≡id₁ : (a : Bool) → isTrue (not not a) → isTrue a lem-not²≡id₁ true p = p lem-not²≡id₁ false () -- обывательская версия lem-not²≡id₂ : (a : Bool) → isTrue (not not a) → isTrue a lem-not²≡id₂ true p = p lem-not²≡id₂ false p = pВо второй версии во втором клозе мы спокойно пишем p, хотя его тип isTrue (not not false) редуцируется к необитаемому False.
С каноническим примером такое не пройдёт
open import Data.Nat data Fin : ℕ → Set where fzero : {n : ℕ} → Fin (suc n) fsuc : {n : ℕ} → Fin n → Fin (suc n) magic₁ : {A : Set} → Fin zero → A magic₁ () magic₂ : {A : Set} → Fin zero → A magic₂ n = {! !}Если здесь в дырку в magic₂ засунуть _, то нам покрасят его жёлтым, сигнализируя тем самым, что подходящей метапеременной Агде тут не вывести.