Permutations of a list #
In this file we prove properties about List.Permutations
, a list of all permutations of a list. It
is defined in Data.List.Defs
.
Order of the permutations #
Designed for performance, the order in which the permutations appear in List.Permutations
is
rather intricate and not very amenable to induction. That's why we also provide List.Permutations'
as a less efficient but more straightforward way of listing permutations.
List.Permutations
#
TODO. In the meantime, you can try decrypting the docstrings.
List.Permutations'
#
The list of partitions is built by recursion. The permutations of []
are [[]]
. Then, the
permutations of a :: l
are obtained by taking all permutations of l
in order and adding a
in
all positions. Hence, to build [0, 1, 2, 3].permutations'
, it does
[[]]
[[3]]
[[2, 3], [3, 2]]]
[[1, 2, 3], [2, 1, 3], [2, 3, 1], [1, 3, 2], [3, 1, 2], [3, 2, 1]]
[[0, 1, 2, 3], [1, 0, 2, 3], [1, 2, 0, 3], [1, 2, 3, 0],
[0, 2, 1, 3], [2, 0, 1, 3], [2, 1, 0, 3], [2, 1, 3, 0],
[0, 2, 3, 1], [2, 0, 3, 1], [2, 3, 0, 1], [2, 3, 1, 0],
[0, 1, 3, 2], [1, 0, 3, 2], [1, 3, 0, 2], [1, 3, 2, 0],
[0, 3, 1, 2], [3, 0, 1, 2], [3, 1, 0, 2], [3, 1, 2, 0],
[0, 3, 2, 1], [3, 0, 2, 1], [3, 2, 0, 1], [3, 2, 1, 0]]
TODO #
Show that l.Nodup → l.permutations.Nodup
. See Data.Fintype.List
.
The r
argument to permutationsAux2
is the same as appending.
The ts
argument to permutationsAux2
can be folded into the f
argument.
The f
argument to permutationsAux2
when r = []
can be eliminated.
An expository lemma to show how all of ts
, r
, and f
can be eliminated from
permutationsAux2
.
(permutationsAux2 t [] [] ys id).2
, which appears on the RHS, is a list whose elements are
produced by inserting t
into every non-terminal position of ys
in order. As an example:
#eval permutationsAux2 1 [] [] [2, 3, 4] id
-- [[1, 2, 3, 4], [2, 1, 3, 4], [2, 3, 1, 4]]