是否有方便的证据证明:
++[] : ∀ {ℓ} {A : Set ℓ} {n} (vec : Vec A n) -> vec ++ [] ≡ vec很显然,我甚至不能写出这种证据的类型,因为
n != n Nat.+ Nat.zero of type ℕ
when checking that the expression vec has type
Vec A (n Nat.+ Nat.zero)编辑:不是作业问题,我在发帖前看过Data.Vec.Properties。(我认为这是不言而喻的。)如果这个证据在那里,我找不到它,所以它的名字将是这个问题的一个很好的答案。
发布于 2022-09-25 22:51:03
的确是这样
open import Relation.Binary.PropositionalEquality
postulate
++[] : ∀ {ℓ} {A : Set ℓ} {n} (vec : Vec A n) -> vec ++ [] ≡ vec由于_≡_期望两个定义相同类型的值,并且n + 0 = n仅在命题上而不是在定义上(详见平等 ),所以不会输入n。
因此,您需要的不仅仅是_≡_,还有多个选项(免责声明:我从来没有广泛使用过这些选项)。
但是,正如您所看到的,这需要有一个∀ n -> n + 0 ≡ n的证据,这是一个尴尬和不必要的复杂。
有了这个Pointwise _≡_,您就平等了:
module Pointwise where
open import Data.Vec.Relation.Binary.Pointwise.Inductive
open import Relation.Binary.PropositionalEquality
++[]₂ : ∀ {ℓ} {A : Set ℓ} {n} (vec : Vec A n) -> Pointwise _≡_ (vec ++ []) vec
++[]₂ [] = []
++[]₂ (x ∷ v) = _≡_.refl ∷ ++[]₂ v这是一个很好的解决方案,但是对于每种索引数据类型都需要一个专用的关系(加上与命题相等的转换函数等等),所以非常重。
这很好,但是cong非常复杂,这个解决方案只适用于具有单个索引的数据类型。如果您有另一种数据类型,但这一次有两个索引,那么您将不得不定义另一个版本的[_]_≅_,这一次更加尴尬,并且使用更加复杂的cong。
这个程序不需要任何设置,所以这很好,但是您仍然需要引入一些名称,因为多次使用_≡_ {A = ∃ (Vec A)}太笨重了,不太实用。
https://stackoverflow.com/questions/73841649
复制相似问题