İlk bazı sıkıcı ithalatı:Agda'da/rewrite cümleleri içeren veya alt tabaka yerine yeniden yazma nasıl kullanılır?
import Relation.Binary.PropositionalEquality as PE
import Relation.Binary.HeterogeneousEquality as HE
import Algebra
import Data.Nat
import Data.Nat.Properties
open PE
open HE using (_≅_)
open CommutativeSemiring commutativeSemiring using (+-commutativeMonoid)
open CommutativeMonoid +-commutativeMonoid using() renaming (comm to +-comm)
Şimdi naturals, diyelim ki, tarafından dizine bir türü var olduğunu varsayalım.
postulate Foo : ℕ -> Set
Ve bu tip Foo
çalışan işlevlerin hakkında bazı Eşitlikler kanıtlamak istiyorum. Agda çok zeki olmadığından, bunlar heterojen eşitlikler olacaktır. Basit bir örnek bu |
s hedefi ne yapıyorsun
foo : (m n : ℕ) -> Foo (m + n) -> Foo (n + m)
foo m n x rewrite +-comm n m = x
bar : (m n : ℕ) (x : Foo (m + n)) -> foo m n x ≅ x
bar m n x = {! ?0 !}
barda gol
Goal: (foo m n x | n + m | .Data.Nat.Properties.+-comm n m) ≅ x
————————————————————————————————————————————————————————————
x : Foo (m + n)
n : ℕ
m : ℕ
olduğunu olurdu? Ve bu tür bir terim oluşturmaya bile nasıl başlayabilirim? Bu durumda,
subst
ile değiştirme işlemini el ile yaparak sorunu çözebilirim, ancak bu daha büyük tür ve denklemler için gerçekten çirkin ve sıkıcı olur.
foo' : (m n : ℕ) -> Foo (m + n) -> Foo (n + m)
foo' m n x = PE.subst Foo (+-comm m n) x
bar' : (m n : ℕ) (x : Foo (m + n)) -> foo' m n x ≅ x
bar' m n x = HE.≡-subst-removable Foo (+-comm m n) x