2016-11-21 27 views
5

Ben Coq en matematiksel kanıtı dilini öğrenmeye çalışıyorum, ama şu saçma açıklamaya azaltılmış bir şey kanıtlamaya çalışıyor bazı belaya girdi:Coq en matematiksel kanıtı dil: eğer Yeniden Yazma koşul

Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0. 

İşte benim girişimi:

proof. 
    let b: bool. 
    let H: (b = true). 

Bu noktada kanıtı durumdur:

b : bool 
    H : b = true 
    ============================ 
    thesis := 
    (if b then 0 else 1) = 0 

Şimdi, tezi kanıtlayabilmek için if koşulunu b koşulunu true'a yeniden yazmak istiyorum. Ancak,

have ((if b then 0 else 1) = (if true then 0 else 1)) by H. 

bir "küçük bir adım" ve

have ((if b then 0 else 1) = 0) by H. 

bir "daha büyük bir adım" hem normal, ben durumda yeniden yazma yanlış bir şey olduğunu sanmıyorum Warning: Insufficient justification. ile başarısız rewrite -> H taktiği aynı şeyi yapacak.

Ben de bu bir işlevde if sararak sorunsuz çalışması için alabilirsiniz:

Definition ite (cond: bool) (a b: nat) := if cond then a else b. 
Lemma bar: forall b: bool, b = true -> (ite b 0 1) = 0. 
proof. 
    let b: bool. let H: (b = true). 
    have (ite b 0 1 = ite true 0 1) by H. thus ~= 0. 
end proof. 

Bu elbette çok güzel değil. Yanlış bir şey yapıyorum? Orijinal kanıtımı kurtarmanın bir yolu var mı? Bu, matematiksel ispat dilinin uygulanmasının bir kusuru mu?

a := false : bool 
    b := true : bool 
    H : False 
    ============================ 
    thesis := 
    if b then True else False 

Coq < reconsider thesis as True. 

Ama bağlam içine b := true bölümünü almak için nasıl bilmiyorum:

I (https://coq.inria.fr/doc/Reference-Manual013.html de) kılavuzunda Bölüm 11.3.3 bir olasılıkla ilgili bir örnek olduğuna dikkat.

cevap

3

Olası bir çözüm (sect. 11.3.12 bakınız) b üzerine per cases kullanmaktır

Lemma manual_11_3_3 : 
    if false then True else False -> 
    if true then True else False. 
proof. 
    define a as false. 
    define b as true. 
    assume H : (if a then True else False). 
    reconsider H as False. 
    reconsider thesis as True. 
Abort. 
+0

Şartlı olarak "kabul ediyorum", çünkü bu benim beklediğim yeniden yazma olmasa bile gitmenin en iyi yolu olabilir (ve yine de izin verilmesi gerektiğini düşünüyorum). 'define', örneğimdeki bağlamda bir' b' koyar, ancak orijinali b' - b0' olarak yeniden adlandırır. Bilindiği gerçeğini “b” nin doğru olduğunu kullanmama izin vermez. Yani bu gitmek için yol gibi görünmüyor. Teşekkürler! –

+0

(1) Evet, bu sadece bir çözüm. İnsanların bildirim dilini kullanmadıkları ve gözlemlediğiniz davranışların popülaritesini artırmadığı görülüyor. (2) Gerçekten, 'define' foo'da yararlı değil - "b: = true" kısmının içeriğe nasıl girileceğini bilmiyorum. Temel olarak, 'define', 'set' taktiği gibi çalışır. –

-1

proof anahtar kelimesi, bildiren bir prova moduna giriyor gibi görünüyor. Constrast ile, Proof anahtar kelimesi, zorunlu olan bir prova moduna girer. Bu ikinci durumda, aşağıdaki gibi kolayca kanıtlayabiliriz.

Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0.          
Proof.                        
    intros b H.                      
    rewrite H.                       
    reflexivity.                      
Qed. 

İlk durumda bir yanıt yok. Sizinkilere benzeyen birtakım yaklaşımları denedim ama aynı problemi tekrar tekrar buldum. Belki de bildirici kanıtlarla daha aşina olan biri tam bir cevap verebilir. Çözümü bulursanız lütfen bize bildirin! Bunun için define kullanabilirsiniz,

Lemma foo: 
    forall b: bool, b = true -> (if b then 0 else 1) = 0. 
proof. 
    let b : bool. 
    per cases on b. 
    suppose it is true. thus thesis. 
    suppose it is false. thus thesis. 
    end cases. 
end proof. 
Qed. 

Ben de referans manuel örnek ispatı durumunu yeniden çalıştı:

+2

Evet, bu "bildirim modu", Coq el kitabının 11. Bölümünün "matematiksel ispatlama dili" olarak adlandırdığı şeydir. Isabelle/HOL ile çalışmış olduğumu bildiğim bu tarz kanıtları severim. Bu yüzden bunu şimdi öğrenmek istiyorum; Zaten taktik dili biliyorum ve bu kanıt önemsiz olduğunu biliyoruz ;-) –

+0

Bu mantıklı.Anton'un yardım edebileceğine sevindim. Deklarasyon dilinin bu basit özelliğinin doğrudan çalışmadığı düşüncesi utanç verici! –