Показ (голова. init), = направляются в Agda

Я пытаюсь доказать простую лемму в 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)) компонент. Я предполагаю, что мои вопросы; действительно ли возможно, как и что это называет средним.

Большое спасибо.

8
задан Jason Reich 10 August 2010 в 16:09
поделиться

1 ответ

Хорошо. Я получил это путем обмана, и я надеюсь, что у кого-нибудь есть лучшее решение. Я выбросил всю дополнительную информацию, которую вы получаете от init , определяемого в терминах initLast , и создал свою собственную наивную версию.

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

Теперь лемма тривиальна.

Есть другие предложения?

3
ответ дан 5 December 2019 в 15:17
поделиться