Я пытаюсь доказать простую лемму в Agda, который я думаю, верно.
Если вектор имеет больше чем два элемента, беря
head
следующее взятиеinit
совпадает со взятиемhead
сразу.
Я сформулировал его следующим образом:
lem-headInit : ∀{l} (xs : Vec ℕ (suc (suc l)))
-> head (init xs) ≡ head xs
lem-headInit (x ∷ xs) = ?
Который дает мне;
.l : ℕ
x : ℕ
xs : Vec ℕ (suc .l)
------------------------------
Goal: head (init (x ∷ xs) | (initLast (x ∷ xs) | initLast xs)) ≡ x
как ответ.
Я действительно не полностью понимаю, как читать (init (x ∷ xs) | (initLast (x ∷ xs) | initLast xs))
компонент. Я предполагаю, что мои вопросы; действительно ли возможно, как и что это называет средним.
Большое спасибо.
Хорошо. Я получил это путем обмана, и я надеюсь, что у кого-нибудь есть лучшее решение. Я выбросил всю дополнительную информацию, которую вы получаете от init
, определяемого в терминах initLast
, и создал свою собственную наивную версию.
initLazy : ∀{A l} → Vec A (suc l) → Vec A l
initLazy (x ∷ []) = []
initLazy (x ∷ (y ∷ ys)) = x ∷ (initLazy (y ∷ ys))
Теперь лемма тривиальна.
Есть другие предложения?