Вывести все подмножества заданного множества на Prolog

Узнай цену своей работы

Формулировка задачи:

Листинг программы
  1. domains
  2. ilist=integer*
  3. predicates
  4. next(ilist,ilist)
  5. normirovka(ilist,ilist).
  6. show(ilist,integer).
  7. showall(ilist).
  8. main.
  9. clauses
  10. normirovka([2,A|Tail],[0|NewTail]):-A1=A+1,normirovka([A1|Tail],NewTail).
  11. normirovka([H|Tail],[H|Tail]):-H<2.
  12. next([H|Tail],Next):-H1=H+1,normirovka([H1|Tail],Next).
  13. show([],_).
  14. show([1|Tail],I):-write(I," "),I1=I+1,show(Tail,I1).
  15. show([0|Tail],I):-I1=I+1,show(Tail,I1).
  16. showall(Temp):-not(next(Temp,_)),!,show(Temp,0),nl.
  17. showall(Temp):-show(Temp,0),nl,next(Temp,Next),showall(Next).
  18. main:-showall([0,0,0]). %тут количество нулей равно n
  19. goal
  20. main.
Есть код, но он почему-то не запускается под ideone. С прологом имею дело первый и, надеюсь, последний раз. Прошу Вашей помощи!

Решение задачи: «Вывести все подмножества заданного множества на Prolog»

textual
Листинг программы
  1. normirovka([2, A|Tail], [0|NewTail]) :-
  2.     A1 is A+1,
  3.     normirovka([A1|Tail], NewTail).
  4. normirovka([H|Tail], [H|Tail]) :-
  5.     H<2.
  6.  
  7. next([H|Tail], Next) :-
  8.     H1 is H+1,
  9.     normirovka([H1|Tail], Next).
  10.  
  11. show([], _).
  12. show([1|Tail], I) :-
  13.     write(I),
  14.     write(" "),
  15.     I1 is I+1,
  16.     show(Tail,I1).
  17. show([0|Tail], I) :-
  18.     I1 is I+1,
  19.     show(Tail, I1).
  20.  
  21. showall(Temp) :-
  22.     not(next(Temp,_)),
  23.     !,
  24.     show(Temp,0),
  25.     nl.
  26. showall(Temp) :-
  27.     show(Temp,0),
  28.     nl,
  29.     next(Temp,Next),
  30.     showall(Next).
  31.  
  32. main :-
  33.     showall([0,0,0]). %тут количество нулей равно n
  34.  
  35. ?- main.

Объяснение кода листинга программы

В этом коде используется рекурсивная функция для генерации всех подмножеств заданного множества. Вот список функций и их назначений:

  1. normirovka/2 - Эта функция используется для нормализации входных данных. Она добавляет единицу к каждому элементу входного списка, кроме последнего.
  2. next/2 - Эта функция используется для перехода к следующему элементу в списке. Она увеличивает текущий элемент на единицу и вызывает функцию normirovka для обработки нового элемента.
  3. show/2 - Эта функция используется для отображения подмножеств. Она записывает текущий элемент и затем вызывает себя для обработки следующего элемента.
  4. showall/1 - Эта функция используется для отображения всех подмножеств. Она вызывает функцию show для пустого списка и затем рекурсивно вызывает себя для следующего подмножества.
  5. main/0 - Это точка входа в программу. Она вызывает функцию showall с аргументом [0,0,0], что означает вывести все подмножества из трех элементов. Таким образом, этот код генерирует и выводит все подмножества из заданного множества.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.267 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы