我想有一个归纳类型来描述排列及其对某些容器的行为。很明显,根据这种类型的描述,算法的定义复杂度(就其长度而言)(计算组合或逆,分解成不相交的循环等)将会变化。
考虑Coq中的以下定义。我认为这是Lehmer代码的正式化:
Inductive Permutation : nat -> Set :=
| nil : Permutation 0
| cons : forall (n k : nat), Permutation (k + n) -> Permutation (k + S n).
很容易在大小为n的向量上定义它的动作,在其他容器上稍微硬一点,并且(至少对我来说)很难找到组合的形式化或逆向。
或者,我们可以将置换表示为具有属性的有限映射。可以容易地定义组合或逆,但是将其分解成不相交的循环是困难的。
所以我的问题是:是否有任何文件可以解决这个权衡问题?我设法找到的所有作品都在命令式设置中处理计算复杂性,而我对“推理复杂性”和函数式编程感兴趣。
答案 0 :(得分:4)
Georges Gonthier对他的4色定理和Feit-Thompson定理的证明进行了广泛的研究。他用于coq的ssreflect包通过在Coq中使用计算而不是使用策略来促进关于排列的推理,特别是在有限集上。他的seq库是切入点。
http://ssr2.msr-inria.inria.fr/doc/ssreflect-1.4/Ssreflect.seq.html
你可以在这里获得完整的资源。
http://research.microsoft.com/en-us/downloads/5464E7B1-BD58-4F7C-BFE1-5D3B32D42E6D/default.aspx
最后,
http://comments.gmane.org/gmane.science.mathematics.logic.coq.club/4193
讨论了排列的3种表示。