Вывести все подмножества заданного множества на Prolog
Формулировка задачи:
Есть код, но он почему-то не запускается под ideone. С прологом имею дело первый и, надеюсь, последний раз. Прошу Вашей помощи!
Решение задачи: «Вывести все подмножества заданного множества на Prolog»
textual
Листинг программы
normirovka([2, A|Tail], [0|NewTail]) :-
A1 is A+1,
normirovka([A1|Tail], NewTail).
normirovka([H|Tail], [H|Tail]) :-
H<2.
next([H|Tail], Next) :-
H1 is H+1,
normirovka([H1|Tail], Next).
show([], _).
show([1|Tail], I) :-
write(I),
write(" "),
I1 is I+1,
show(Tail,I1).
show([0|Tail], I) :-
I1 is I+1,
show(Tail, I1).
showall(Temp) :-
not(next(Temp,_)),
!,
show(Temp,0),
nl.
showall(Temp) :-
show(Temp,0),
nl,
next(Temp,Next),
showall(Next).
main :-
showall([0,0,0]). %тут количество нулей равно n
?- main.
Объяснение кода листинга программы
В этом коде используется рекурсивная функция для генерации всех подмножеств заданного множества. Вот список функций и их назначений:
- normirovka/2 - Эта функция используется для нормализации входных данных. Она добавляет единицу к каждому элементу входного списка, кроме последнего.
- next/2 - Эта функция используется для перехода к следующему элементу в списке. Она увеличивает текущий элемент на единицу и вызывает функцию normirovka для обработки нового элемента.
- show/2 - Эта функция используется для отображения подмножеств. Она записывает текущий элемент и затем вызывает себя для обработки следующего элемента.
- showall/1 - Эта функция используется для отображения всех подмножеств. Она вызывает функцию show для пустого списка и затем рекурсивно вызывает себя для следующего подмножества.
- main/0 - Это точка входа в программу. Она вызывает функцию showall с аргументом [0,0,0], что означает
вывести все подмножества из трех элементов. Таким образом, этот код генерирует и выводит все подмножества из заданного множества.