Я не совсем понимаю, как
прочитайте компонент (init (x ∷ xs) | (initLast (x
∷ xs) | initLast xs))
. я
предположим, мои вопросы; это
возможно, как и что означает этот термин
имею в виду.
Это говорит о том, что значение init (x ∷ xs)
зависит от значения всего справа от |
. Когда вы доказываете что-то в функции в Agda, ваше доказательство должно иметь структуру исходного определения.
В этом случае вы должны использовать результат initLast
, поскольку определение initLast
делает это до получения каких-либо результатов.
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
Итак, вот как мы пишем лемму.
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
Я позволил обобщить вашу лемму до Vec A
, поскольку лемма не зависит от содержимого вектора.