Мне интересно, есть ли в Agda что-нибудь похожее на предложение deriving Eq
в Haskell - тогда у меня также есть связанный вопрос ниже.
Например, предположим, что у меня есть типы для игрушечного языка,
data Type : Set where
Nat : Type
Prp : Type
Затем я могу реализовать разрешимое равенство путем сопоставления с образцом и C-c C-a
,
_≟ₜ_ : Decidable {A = Type} _≡_
Nat ≟ₜ Nat = yes refl
Nat ≟ₜ Prp = no (λ ())
Prp ≟ₜ Nat = no (λ ())
Prp ≟ₜ Prp = yes refl
Мне любопытно, можно ли это механизировать или автоматизировать каким-то образом подобно тому, как это делается в Haskell:
data Type = Nat | Prp deriving Eq
Спасибо!
Пока мы говорим о типах, я хотел бы реализовать свои формальные типы как типы Agda: Nat - это просто натуральные числа, а Prp - это небольшие предложения.
⟦_⟧Type : Type → Set ?
⟦ Nat ⟧Type = ℕ
⟦ Prp ⟧Type = Set
К сожалению, это не работает. Я пытался исправить это с помощью подъема, но у меня ничего не вышло, так как я понятия не имел, как использовать подъем по уровню. Любая помощь приветствуется!
Пример использования вышеуказанной функции:
record InterpretedFunctionSymbol : Set where
field
arity : ℕ
src tgt : Type
reify : Vec ⟦ src ⟧Type arity → ⟦ tgt ⟧Type
Спасибо, что потешили меня!