你确实可以使用现有的
All
为了这个。首先定义一个“忘记”结构的函数
全部的
:
open import Data.List
open import Data.List.All
open import Data.Product
lower-All : â {a p} {A : Set a} {P : A â Set p} {xs} â All P xs â List (â P)
lower-All [] = []
lower-All (x â· xs) = (_ , x) â· lower-All xs
然后简单地用
全部的
自身:
AllAll : â {a x p} {X : Set x} {A : X â Set a} (P : â {x} â A x â Set p)
â â {xs} â All A xs â Set _
AllAll P = λ xs â All (P â projâ) (lower-All xs)
这样做的一个缺点是模式匹配
ys : AllAll P xs
您必须在
xs
第一取决于需要编写多少个函数来匹配哪个模式
AllAll
这种编码可能不太方便。一个好处是你可以免费获得额外的“嵌套”:
AllAllAll : â {lâ lâ lâ lâ}
{Aâ : Set lâ}
{Aâ : Aâ â Set lâ}
{Aâ : â {x} â Aâ x â Set lâ}
(Aâ : â {x} {y : Aâ x} â Aâ y â Set lâ)
â â {xsâ} {xsâ : All Aâ xsâ} (xsâ : AllAll Aâ xsâ) â Set _
AllAllAll P = AllAll P
(尽管如果你发现自己需要这样一个怪物,也许可以考虑重构你的程序……)
我留下来作为练习来证明这个版本和OP中的版本之间的同构。