Это действительно наивный вид - он пересекает дерево всех возможных перестановок, пока, к счастью, не находит отсортированный. Это сложность O (n!) Я предполагаю:>
Насчет функции перестановки - она работает "в обратном направлении" - обратите внимание, что определение выводит голову из результата . Если вы перевернете свою точку зрения, вы заметите, что вместо удаления она фактически вставляет значения, работая в обратном направлении. Поскольку алгоритм работает в обратном направлении, следовательно, выбранный символ H
может быть любым, что позволит создать результат, а следовательно, и любым неиспользованным значением из List.
В основном алгоритм перестановки переводится в следующую процедурную реализацию:
- выбрать предмет из списка
- положить его перед отсортированным
Таким образом, вы генерируете перестановки. Все они.
Вкратце - perm генерирует все пространство возможных решений, начиная с пустого решения и проверяя, насколько данное решение возможно из действительного удаления.
?- perm( [ 1, 2, 3 ] , P )
P = [1, 2, 3];
P = [1, 3, 2];
P = [2, 1, 3];
P = [2, 3, 1];
P = [3, 1, 2];
P = [3, 2, 1];
no