protocol

# `derangements_protocol`

Protocol for derangement operations over lists.

Availability:
`logtalk_load(derangements(loader))`
Author: Paulo Moura
Version: 1:0:0
Date: 2026-05-12
Compilation flags:
`static`
Dependencies:
(none)
Remarks:
(none)
Inherited public predicates:
(none)

## Public predicates

### `derangements/2`

Generates all derangements of a list using default order.

Compilation flags:
`static`
Template:
`derangements(List,Derangements)`
Mode and number of proofs:
`derangements(+list,-list)` - `one`

### `derangement/2`

True iff the second argument is a derangement of the first argument using default order.

Compilation flags:
`static`
Template:
`derangement(List,Derangement)`
Mode and number of proofs:
`derangement(+list,-list)` - `zero_or_more`

### `derangements/3`

Generates all derangements with the given order: `default`, `lexicographic`, or `shortlex`.

Compilation flags:
`static`
Template:
`derangements(List,Order,Derangements)`
Mode and number of proofs:
`derangements(+list,+atom,-list)` - `one`

### `derangement/3`

True iff the third argument is a derangement with the given order: `default`, `lexicographic`, or `shortlex`.

Compilation flags:
`static`
Template:
`derangement(List,Order,Derangement)`
Mode and number of proofs:
`derangement(+list,+atom,-list)` - `zero_or_more`

### `distinct_derangements/2`

Generates all distinct derangements of a list using default order.

Compilation flags:
`static`
Template:
`distinct_derangements(List,Derangements)`
Mode and number of proofs:
`distinct_derangements(+list,-list)` - `one`

### `distinct_derangement/2`

True iff the second argument is a distinct derangement of the first argument using default order.

Compilation flags:
`static`
Template:
`distinct_derangement(List,Derangement)`
Mode and number of proofs:
`distinct_derangement(+list,-list)` - `zero_or_more`

### `distinct_derangements/3`

Generates all distinct derangements with the given order: `default`, `lexicographic`, or `shortlex`.

Compilation flags:
`static`
Template:
`distinct_derangements(List,Order,Derangements)`
Mode and number of proofs:
`distinct_derangements(+list,+atom,-list)` - `one`

### `distinct_derangement/3`

True iff the third argument is a distinct derangement with the given order: `default`, `lexicographic`, or `shortlex`.

Compilation flags:
`static`
Template:
`distinct_derangement(List,Order,Derangement)`
Mode and number of proofs:
`distinct_derangement(+list,+atom,-list)` - `zero_or_more`

### `nth_derangement/3`

Returns the derangement at a given zero-based index using default order.

Compilation flags:
`static`
Template:
`nth_derangement(List,Index,Derangement)`
Mode and number of proofs:
`nth_derangement(+list,+integer,-list)` - `zero_or_one`

### `nth_derangement/4`

Returns the derangement at a given zero-based index in the given order: `default`, `lexicographic`, or `shortlex`.

Compilation flags:
`static`
Template:
`nth_derangement(List,Order,Index,Derangement)`
Mode and number of proofs:
`nth_derangement(+list,+atom,+integer,-list)` - `zero_or_one`

### `derangement_index/3`

Returns the zero-based index of a derangement using default order.

Compilation flags:
`static`
Template:
`derangement_index(List,Derangement,Index)`
Mode and number of proofs:
`derangement_index(+list,+list,-integer)` - `zero_or_one`

### `derangement_index/4`

Returns the zero-based index of a derangement in the given order: `default`, `lexicographic`, or `shortlex`.

Compilation flags:
`static`
Template:
`derangement_index(List,Order,Derangement,Index)`
Mode and number of proofs:
`derangement_index(+list,+atom,+list,-integer)` - `zero_or_one`

### `count_derangements/2`

Counts the number of derangements of a list.

Compilation flags:
`static`
Template:
`count_derangements(List,Count)`
Mode and number of proofs:
`count_derangements(+list,-integer)` - `one`

### `count_partial_derangements/3`

Counts the number of permutations of a list with exactly the given number of fixed points.

Compilation flags:
`static`
Template:
`count_partial_derangements(FixedPoints,List,Count)`
Mode and number of proofs:
`count_partial_derangements(+integer,+list,-integer)` - `one`

### `count_distinct_derangements/2`

Counts the number of distinct derangements of a list (deduplicating equal-valued derangements).

Compilation flags:
`static`
Template:
`count_distinct_derangements(List,Count)`
Mode and number of proofs:
`count_distinct_derangements(+list,-integer)` - `one`

### `nth_distinct_derangement/3`

Returns the distinct derangement at a given zero-based index in default generation order.

Compilation flags:
`static`
Template:
`nth_distinct_derangement(List,Index,Derangement)`
Mode and number of proofs:
`nth_distinct_derangement(+list,+integer,-list)` - `zero_or_one`

### `distinct_derangement_index/3`

Returns the zero-based index of a distinct derangement in default generation order.

Compilation flags:
`static`
Template:
`distinct_derangement_index(List,Derangement,Index)`
Mode and number of proofs:
`distinct_derangement_index(+list,+list,-integer)` - `zero_or_one`

### `random_derangement/2`

Returns a random derangement of a list.

Compilation flags:
`static`
Template:
`random_derangement(List,Derangement)`
Mode and number of proofs:
`random_derangement(+list,-list)` - `zero_or_one`

### `sample_derangements/3`

Returns SampleCount random derangements of a list, sampled with replacement.

Compilation flags:
`static`
Template:
`sample_derangements(List,SampleCount,Samples)`
Mode and number of proofs:
`sample_derangements(+list,+integer,-list)` - `zero_or_one`

### `random_distinct_derangement/2`

Returns a random distinct derangement of a list (deduplicating equal-valued derangements).

Compilation flags:
`static`
Template:
`random_distinct_derangement(List,Derangement)`
Mode and number of proofs:
`random_distinct_derangement(+list,-list)` - `zero_or_one`

### `sample_distinct_derangements/3`

Returns SampleCount random distinct derangements of a list, sampled with replacement after deduplicating equal-valued derangements.

Compilation flags:
`static`
Template:
`sample_distinct_derangements(List,SampleCount,Samples)`
Mode and number of proofs:
`sample_distinct_derangements(+list,+integer,-list)` - `zero_or_one`

### `next_derangement/3`

Returns the next distinct derangement value in lexicographic order induced by the first argument.

Compilation flags:
`static`
Template:
`next_derangement(List,Derangement,Next)`
Mode and number of proofs:
`next_derangement(+list,+list,-list)` - `zero_or_one`

### `previous_derangement/3`

Returns the previous distinct derangement value in lexicographic order induced by the first argument.

Compilation flags:
`static`
Template:
`previous_derangement(List,Derangement,Previous)`
Mode and number of proofs:
`previous_derangement(+list,+list,-list)` - `zero_or_one`

## Protected predicates

(none)

## Private predicates

(none)

## Operators

(none)