如何从多重集的所有元素中提取数据?

How can I extract data from all elements of a multiset?

假设我有一个名为 dtyp 的数据类型。看起来像这样

datatype dtype = T bool int

我想定义一个函数 extr :: "dtype multiset => int multiset",它采用这些 dtype 元素的多重集和 returns 包含每个 dtype 中的整数的多重集元素。例如:

value "extr {#T True 4, T False 5, T False 7#}" 应该给 {#4,5,7#}

我首先想到遍历多重集,但我知道这是不可能的,因为这些多重集基于不可迭代的普通集。然后我想到了通用量词,但我不确定在这种情况下如何使用它们。我可以帮忙吗?

提前致谢!

一些用于直接定义提取器的奇特语法:

datatype dtype = T bool (payload: int)

考虑集合是一个很好的起点:您正在寻找 image 的多重集合。该函数存在,它被称为 image_mset。所以:

definition extr :: "dtype multiset => int multiset" where
  "extr = image_mset payload"

语法 `# for image_mset 尚未添加到 Multiset 条目中,但它已被各种人使用。

notation image_mset (infixr "`#" 90)