我想有一个归纳类型来描述排列及其对某些容器的作用。很明显,根据对这种类型的描述,算法的定义复杂性(就其长度而言)(计算组合或逆,分解成不相交的循环等)会有所不同。
考虑 Coq 中的以下定义。我相信这是 Lehmer 代码的形式化:
Inductive Permutation : nat -> Set :=
| nil : Permutation 0
| cons : forall (n k : nat), Permutation (k + n) -> Permutation (k + S n).
在大小为 n 的向量上定义它的作用很容易,在其他容器上稍微难一些,而且(至少对我而言)很难找到组合或逆的形式化。
或者,我们可以将置换表示为具有属性的有限映射。组合或逆可以很容易地定义,但将其分解为不相交的循环是困难的。
所以我的问题是:有没有解决这个权衡问题的论文?我设法找到的所有作品都处理命令式设置中的计算复杂性,而我对“推理复杂性”和函数式编程感兴趣。