Agda 列表是与 1 的列表连接起来的天然通用列表的最后一个

Agda list last of a generic list of naturals concatenated with a list of 1

提问人:fsuna064 提问时间:11/16/2020 更新时间:11/17/2020 访问量:74

问:

我有这个功能:

natListLast : List ℕ → ℕ
natListLast []            = 0
natListLast nats@(x ∷ xs) = v.last (v.fromList nats)

当我这样做时

_ : natListLast (2 l.∷ l.[] l.++ 1 l.∷ l.[]) ≡ 1
_ = refl

我没有收到任何错误。

但是当我试图将其推广到这样的任意内容时:List nat

natListConcatLast : (nats : List ℕ) → natListLast (nats l.++ 1 l.∷ l.[]) ≡ 1
natListConcatLast [] = refl
natListConcatLast nats@(x ∷ xs) = ?

我不确定该用什么替换。?

我试着从以下几个方面开始:begin

natListConcatLast : (nats : List ℕ) → natListLast (nats l.++ 1 l.∷ l.[]) ≡ 1
natListConcatLast [] = refl
natListConcatLast nats@(x ∷ xs) =
  begin
    natListLast (nats l.++ 1 l.∷ l.[])
  ≡⟨⟩
    v.last (v.fromList ((x l.∷ xs) l.++ 1 l.∷ l.[]))
  ≡⟨⟩
    ?
  ≡⟨⟩
    1
  ∎

但是我收到此错误:

1 !=
(last (fromList ((x List.∷ xs) l.++ 1 List.∷ List.[]))
 | initLast (fromList ((x List.∷ xs) l.++ 1 List.∷ List.[])))
of type ℕ
when checking that the expression 1 ∎ has type
last (fromList ((x List.∷ xs) l.++ 1 List.∷ List.[])) ≡ 1

我不确定如何解释此错误。我不知道如何处理.| initLast

谢谢!

列出 AGDA VEC

评论

0赞 Cactus 11/16/2020
你有什么充分的理由想要定义 via 而不是直接编写它吗?natListLastData.Vec.last
0赞 fsuna064 11/17/2020
我需要它,因为如果我直接使用,我会收到错误l.foldr (λ _ → suc) 0 (nats l.++ 1 List.∷ List.[]) != suc _n_199 of type ℕ when checking that the expression fromList (nats l.++ 1 List.∷ l.[]) has type Vec ℕ (1 + _n_199)v.last (v.fromList <...>))

答:

2赞 MrO 11/17/2020 #1

我建议以下解决方案:

open import Data.List
open import Data.Nat
open import Relation.Binary.PropositionalEquality using (_≡_ ; refl)

natListLast : List ℕ → ℕ
natListLast [] = 0
natListLast (x ∷ []) = x
natListLast (_ ∷ y ∷ l) = natListLast (y ∷ l)

natListConcatLast : ∀ l → natListLast (l ++ [ 1 ]) ≡ 1
natListConcatLast [] = refl
natListConcatLast (_ ∷ []) = refl
natListConcatLast (_ ∷ _ ∷ l) = natListConcatLast (_ ∷ l)