Найти все перестановки чисел 1, 2, 3, 4 и 5, в которых ни одно число не стоит на своём месте - Prolog
Формулировка задачи:
Найдите все перестановки чисел 1, 2, 3, 4 и 5, в которых ни одно число не стоит на своём месте. Для этого напишите программу.
Как сделать можно? Очень буду благодарен
Решение задачи: «Найти все перестановки чисел 1, 2, 3, 4 и 5, в которых ни одно число не стоит на своём месте»
textual
Листинг программы
find_all_perm(L, Res) :- findall( L1, (permutation(L, L1), not_in_place(L1)), Res ), forall( member(X, Res), writeln(X) ). not_in_place(L) :- not_in_place(L, 1). not_in_place([], _). not_in_place([H|T], N) :- not(H = N), N1 is N + 1, not_in_place(T, N1).
Объяснение кода листинга программы
Код решает задачу поиска всех перестановок чисел 1, 2, 3, 4 и 5, в которых ни одно число не стоит на своём месте. Вводная часть кода:
find_all_perm(L, Res) :-- определение переменнойRes, которая будет хранить все перестановкиfindall( L1, (permutation(L, L1), not_in_place(L1)), Res ),- вызов функцииfindall, которая ищет все перестановки с помощью правилаpermutation(L, L1), и с помощью условияnot_in_place(L1)проверяет, что числа не стоят на своих местахforall( member(X, Res), writeln(X) ).- вывод всех найденных перестановок с помощью циклаforallи функцииwritelnСледующая часть кода - это определение функцииnot_in_place, которая проверяет, что числа не стоят на своих местах:not_in_place(L) :-- определение переменнойL, которая является списком чиселnot_in_place(L, 1).- рекурсивный вызов функцииnot_in_placeдля первого числа в спискеLnot_in_place([], _).- базовый случай, когда список пустойnot_in_place([H|T], N) :-- рекурсивный вызов функцииnot_in_placeдля спискаTи проверка, что текущее числоHне равноNN1 is N + 1.- увеличение значенияNна единицуnot_in_place(T, N1).- рекурсивный вызов функцииnot_in_placeдля спискаTи нового значенияN1Таким образом, код проверяет все возможные перестановки чисел 1, 2, 3, 4 и 5, и выводит только те, в которых числа не стоят на своих местах.