Проверить является ли заданный граф блоком SWI prolog

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

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

Граф задается списком ребер, нужно проверить является ли заданный граф блоком на SWI prolog. Блок - связный, непустой, не имеющий точек сочленения неориентированный граф. Есть код разбиения графа на блоки на visual prolog:
Листинг программы
  1. domains
  2. дуга=д(integer,integer)
  3. дуги=дуга*
  4. циклы=дуги*
  5. il=integer*
  6. predicates
  7. блоки(дуги,циклы,циклы)
  8. nondeterm взять(дуги,дуга,дуги)
  9. nondeterm простой_цикл(integer,integer,дуги,дуги,il,дуги)
  10. объединение(циклы,дуги,дуги)
  11. разность(дуги,дуги,дуги)
  12. принадл(integer,il)
  13. clauses
  14. блоки(Граф,Блоки,Ответ):-
  15. взять(Граф,д(X,Y),Граф1),
  16. findall(Цикл,простой_цикл(Y,X,Граф,[д(X,Y)],[Y],Цикл),Циклы),
  17. объединение(Циклы,[],Блок),
  18. разность(Граф1,Блок,Граф2),!,
  19. блоки(Граф2,[Блок|Блоки],Ответ).
  20. блоки([],Блоки,Блоки).
  21. взять([д(X,Y)|Граф],Ребро,Граф):- Ребро=д(X,Y);Ребро=д(Y,X).
  22. взять([Дуга|Граф],Ребро,[Дуга|Граф1]):- взять(Граф,Ребро,Граф1).
  23. простой_цикл(Y,X,Граф,Ребра,Вершины,Цикл):- Y<>X,
  24. взять(Граф,д(Y,Z),Граф1),not(принадл(Z,Вершины)),
  25. простой_цикл(Z,X,Граф1,[д(Y,Z)|Ребра],[Z|Вершины],Цикл).
  26. простой_цикл(X,X,_,Цикл,_,Цикл).
  27. объединение([[Д|Цикл]|Циклы],Ребра,Блок):- взять(Ребра,Д,_),!,
  28. объединение([Цикл|Циклы],Ребра,Блок).
  29. объединение([[Д|Цикл]|Циклы],Ребра,Блок):- объединение([Цикл|Циклы],[Д|Ребра],Блок).
  30. объединение([[]|Циклы],Ребра,Блок):- объединение(Циклы,Ребра,Блок).
  31. объединение([],Блок,Блок).
  32. разность([Д|Граф],Блок,Граф1):- взять(Блок,Д,Блок1),!,
  33. разность(Граф,Блок1,Граф1).
  34. разность([Д|Граф],Блок,[Д|Граф1]):- разность(Граф,Блок,Граф1).
  35. разность([],_,[]).
  36. принадл(Вершина,[Вершина|_]):- !.
  37. принадл(Вершина,[_|Вершины]):- принадл(Вершина,Вершины).
  38. goal
  39. блоки([д(1,2),д(2,3),д(3,4),д(4,5),д(5,6),д(2,5),д(6,1),д(5,7),д(5,8),д(7,8),д(2,9)],[],Блоки).
Просьба помочь, спасибо.

Решение задачи: «Проверить является ли заданный граф блоком SWI prolog»

textual
Листинг программы
  1. blocks([d(1,2),d(2,3),d(3,4),d(4,5),d(5,6),d(2,5),d(6,1),d(5,7),d(5,8),d(7,8),d(2,9)],[],Blocks).
  2. checkBlock([d(1,2),d(2,3),d(3,4),d(4,5),d(5,6),d(2,5),d(6,1),d(5,7),d(5,8),d(7,8),d(2,8)]).

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

  1. В первом аргументе функции blocks перечислены пары вершин графа, соединенные ребрами.
  2. Второй аргумент функции blocks пуст, он должен быть таким же, как и первый.
  3. Третий аргумент функции blocks - это список списков, где каждый внутренний список содержит пары вершин графа, соединенные ребрами.
  4. В функции checkBlock перечислены пары вершин графа, соединенные ребрами.
  5. Функция checkBlock проверяет, является ли переданный ей граф блоком SWI prolog.
  6. Результатом выполнения функции checkBlock будет true, если граф является блоком SWI prolog, и false в противном случае.

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


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

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

10   голосов , оценка 3.8 из 5

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

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

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