2012-09-19 14 views
12

İ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 

cevap

9

Bu borular bu azalma söz konusu ifadelerin sonuçlanıncaya kadar askıya alınır gösterir ve bu genellikle sonuç Devam için bilmeniz gereken bir with blok vardı aslında aşağı kaynar. Bunun nedeni, rewrite yapısının, söz konusu ifadenin bir with sözlüğüne, işini yapmak için gerekli olabilecek herhangi bir yardımcı değerle ve refl numaralı bir eşleşmeyle genişlemesidir. Bu durumda

, sadece siz (ve muhtemelen o da anlaşılacağı gibi, çok kapsam içine n + m getirmek gerekir refl üzerinde with blok ve desen maçında +-comm n m tanıtmak gerektiği anlamına gelir, bu nedenle eşitlik şey vardır hakkında konuşmak). Agda değerlendirme modeli oldukça basittir ve eğer bir şey üzerinde eşleme yaparsanız (kayıtlardaki sahte desen eşleşmeleri hariç), aynı şey üzerinde desen eşleşene kadar azalmaz. Aynı ifadeyle yeniden yazarak provalarınızdan kurtulmayı bile başarabilirsiniz, çünkü sadece sizin için özetlediğim şeyi yapar. Daha doğrusu

, sen tanımlarsanız: o, someDataConstructor üzerinde eşleştiği için

f : ... 
f with a | b | c 
... | someDataConstructor | boundButNonConstructorVariable | someRecordConstructor = ... 

ve sonra bir ifadesi olarak f bakın, sen, sadece ifade a için gözlemlenen boruları alacak çok bu kadar azaltmak için en az f almak için a tanıtmak ve daha sonra someDataConstructor ondan maç gerekir. Diğer taraftan, b ve c, blokla aynı şekilde tanıtılmış olsalar da, hiçbir durma değerlendirmesi yapmazlar, çünkü b desen eşleşmesi değildir ve c 'someRecordConstructor, bir kayıt olduğu için tek olası kurucu olarak statik olarak bilinir. eta ile yazın.