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.
Ş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! –
(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. –