2010-08-10 28 views
8

Agda'da doğru olduğunu düşündüğüm basit bir lemma olduğunu kanıtlamaya çalışıyorum.Agda'da (kafa. Init) = kafa gösteriliyor.

bir vektör init alarak aşağıdaki onun head alarak fazla iki öğe, varsa derhal head alarak aynıdır.

şöyle bunu formüle sahip: bana verir Hangi

lem-headInit : ∀{l} (xs : Vec ℕ (suc (suc l))) 
        -> head (init xs) ≡ head xs 
lem-headInit (x ∷ xs) = ? 

; Bir yanıt olarak .

(init (x ∷ xs) | (initLast (x ∷ xs) | initLast xs)) bileşeninin nasıl okunacağını tamamen anlamadım. Sanırım sorularım; Mümkün, bu terimin ne anlama geldiğini ve ne anlama geldiğini.

Çok teşekkürler.

cevap

8

Tamamen (init (x ∷ xs) | (initLast (x ∷ xs) | initLast xs)) bileşeni okumak nasıl anlamıyorum. Ben sorularımın olduğunu varsayalım; mümkün, terimi ne anlama geliyor?

Bu değer init (x ∷ xs)| sağındaki her şeyin değerine bağlı olduğunu söyler. Agda'daki bir işlevle ilgili bir şey kanıtladığınızda, kanıtınızın orijinal tanımın yapısına sahip olması gerekir. Bu örnekte, initLast'un initLast tanımından dolayı, herhangi bir sonuç üretmeden önce bunu yapmanız gerekir. Bu durumda, initLast sonucunda olması gerekir.

init : ∀ {a n} {A : Set a} → Vec A (1 + n) → Vec A n 
init xs   with initLast xs 
       -- ⇧ The first thing this definition does is case on this value 
init .(ys ∷ʳ y) | (ys , y , refl) = ys 

İşte size lemma nasıl yazıyoruz. lemma vektörü içeriğine bağlı değildir çünkü

module inithead where 

open import Data.Nat 
open import Data.Product 
open import Data.Vec 
open import Relation.Binary.PropositionalEquality 

lem-headInit : {A : Set} {n : ℕ} (xs : Vec A (2 + n)) 
      → head (init xs) ≡ head xs 

lem-headInit (x ∷ xs) with initLast xs 
lem-headInit (x ∷ .(ys ∷ʳ y)) | ys , y , refl = refl 

Ben Vec A için lemma genelleme cüretini.

3

Tamam. Bunu aldatarak aldım ve birilerinin daha iyi bir çözümü olduğunu umuyorum. init'dan aldığınız tüm ekstra bilgileri initLast olarak tanımladım ve kendi naif versiyonumu yarattım.

initLazy : ∀{A l} → Vec A (suc l) → Vec A l 
initLazy (x ∷ []) = [] 
initLazy (x ∷ (y ∷ ys)) = x ∷ (initLazy (y ∷ ys)) 

Şimdi lemma önemsizdir.

Diğer teklifler nelerdir?