Types 关于置换的表示

Types 关于置换的表示,types,functional-programming,permutation,coq,agda,Types,Functional Programming,Permutation,Coq,Agda,我想用一个归纳类型来描述排列及其在一些容器上的作用。显然,根据这种类型的描述,算法(计算合成或逆、分解为不相交循环等)的定义复杂度(就其长度而言)将有所不同 考虑Coq中的以下定义。我认为这是勒默准则的形式化: Inductive Permutation : nat -> Set := | nil : Permutation 0 | cons : forall (n k : nat), Permutation (k + n) -> Permutation (k + S n). 它对

我想用一个归纳类型来描述排列及其在一些容器上的作用。显然,根据这种类型的描述,算法(计算合成或逆、分解为不相交循环等)的定义复杂度(就其长度而言)将有所不同

考虑Coq中的以下定义。我认为这是勒默准则的形式化:

Inductive Permutation : nat -> Set :=
| nil : Permutation 0
| cons : forall (n k : nat), Permutation (k + n) -> Permutation (k + S n).
它对大小为n的向量的作用很容易定义,对其他容器的作用稍难定义,而且(至少对我来说)很难找到组成或逆的形式化

或者,我们可以将置换表示为具有属性的有限映射。合成或逆可以很容易地定义,但分解成不相交的循环是困难的


所以我的问题是:有没有关于这个权衡问题的论文?我设法找到的所有作品都处理命令式设置中的计算复杂性,而我对“推理复杂性”和函数式编程感兴趣。

乔治·冈希尔(Georges Gonthier)为证明四色定理和费特·汤普森定理而广泛研究了置换。他的coq的ssreflect包通过在coq中使用计算而不是使用策略,促进了关于排列的推理,特别是在有限集上。他的seq库是入口点

你可以在这里找到完整的资料来源

最后,


讨论置换的3种表示。

我对Coq一无所知,但这有帮助吗?不幸的是,事实并非如此。我想要的是排列的编码,而不涉及容器。虽然有一个与前面提到的类似的容器关系的通用定义会很愉快。也许你可以对它进行专门化,使它排列一个索引的排序列表?另一个对我来说相当有效的表示是我在中使用的。不幸的是,它并没有像双射那样简单的组合概念,这可能会得到更多的关注