Найти все перестановки чисел 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
для первого числа в спискеL
not_in_place([], _).
- базовый случай, когда список пустойnot_in_place([H|T], N) :-
- рекурсивный вызов функцииnot_in_place
для спискаT
и проверка, что текущее числоH
не равноN
N1 is N + 1.
- увеличение значенияN
на единицуnot_in_place(T, N1).
- рекурсивный вызов функцииnot_in_place
для спискаT
и нового значенияN1
Таким образом, код проверяет все возможные перестановки чисел 1, 2, 3, 4 и 5, и выводит только те, в которых числа не стоят на своих местах.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д