2015-04-23 42 views
5

Her biri bir veya iki örtük değişkene A B: Type bağlı olabilecek bir dizi işlevim olduğunu varsayalım. Bunu nasıl belirleyebilirim? Yani bu değişkenleri değişken listesine ekleyin ve bunları örtük olarak ayarlayın.Coq: örtük değişkenler ekleniyor

En belirgin yöntem, tanımlarına {A B: Type} eklemektir. Bununla birlikte, gerçek hayatta ve orta derecede karmaşık gelişmelerde, dolaylı olarak paylaşılmış bu türden çıkarımlar, 6-10 giriş uzunluğunda olabilir ve karmaşık tipler içerebilir, böylece okunması zor olan fonksiyon tanımlamaları ve benzerliklerini anlamak ya da belirtilen türlerde değişiklik yapmak daha da zorlaşır. Böylece bu çözüm geçerli değildir.

Tüm işlevleri bir bölüme veya modüle ekleyebilirim ve Variables (A B: Type) etc'u en başa yazabilirim, ancak bu, değişkenleri örtük hale getirmez ve bölümün sonundaki tüm işlevler için bağımsız değişkenleri el ile ayarlamak zorunda kalırdım. Daha da kötüsü, tüm değişkenleri paylaşırdı. Yani Ben

Section sect. 
    Variable A B: Type. 

    Definition f (t: A -> Type) := (..). 

    Definition g (t: A -> Type) (s: B -> Type) := G (f t) (f s). 
End sect. 

ilan etmeleri halinde sA -> Type olmadığı için esasen f sadece keyfi bir tip ailesini gerektirir rağmen, daha sonra g kabul olmaz (G yaklaşık iki değişkenli fonksiyonudur).

Bir bölüm oluşturabilir ve Context {A B: Type} bildirebilirim. Bu, bu değişkenlerin tüm işlevler için örtülü olmasını sağlar, ancak önceki durumda olduğu gibi paylaşım sorunu hala devam eder. Bu yüzden, işlevlerimi örtük argümanlarının farklı değerleri ile Sect.1'den çağırabilmem için işlevlerimi çeşitli bölümlere ayırmam gerekirdi. Bu işe yarıyor ama çirkin ve her bölümün düzgün bir şekilde çağırabilmem için 2-3 bölüm uzunluğunda olması gereken bir durumu kolayca hayal edebiliyorum.

Daha iyi bir çözüm var mı?

Generalizable All Variables. 

Definition g `(t: A -> Type) `(s: B -> Type) := G (f t) (f s). 

Şimdi backtick kullanabilir ve otomatik olarak tanım geçerli kılmak için gereken örtük değişkenleri ekleyecektir:

+1

Paylaşım sorununu anladığımdan emin değilim. 'Bağlam {A: Tür}' kullanma ve 'f' ve' g' için 'A -> Type' parametresini almanın ne gibi problemleri vardır? –

+0

Üzgünüm, ama hala kafam karıştı. “G” nin tanımını değiştiremediniz, bu da “B” yerine “A” üzerinde parametrelendirilmiş tipler almasını sağladı mı? –

+0

Sanırım şimdi düzgün çalışması gerekiyor. –

cevap

3

az zor olduğunu yapabileceğiniz iki şey vardır. Bu, örtükleri tanıtmanın en yaygın yoludur.

başka yolu ile bölüm takip etmektir:

Arguments g : default implicits. 
Her tanımlanmış bir süre için bu tekrarlamak gerekir

, ama en azından argümanlar hepsinin adını gerekmez.

+1

Backtick genellikle çok tuhaf şekillerde davranır. Bazen görünüşte sahip olması gerektiğinde imlicit türlerini çözemez, nedeni kesinlikle katı kararlılığa dayanıyor. Örneğin. Bazı tip değişkeni birkaç kez göründüğünde, genel olarak birkaç farklı tip anlamına geleceği varsayılır. Ama sanırım bu gerçekten alabildiğim en iyisi. –

+0

Evet, tam olarak nerede argüman sırasına kapalı koyarsa sorunlu da olabilir. Bu durumlarda, açık implikasyonlara geri dönmek zorundasınız. :) –