Гамильтонов путь в графе - Prolog

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

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

Доброго времени! В прологе, откровенно говоря, я чайник. Пытаюсь разобраться. В задании мне задано написать программу для определения гамильтонова пути в графе, заданном множеством вершин и множеством ребер. Вот что получилось:
Листинг программы
  1. domains
  2. G=graph(Nodes,Edges)
  3. nodes=i*
  4. edges=edge*
  5. edge=e(i,i)
  6. i=integer
  7. ilist=i*
  8. predicates
  9. member_e(edge,edges)
  10. nondeterm member_n(i,ilist)
  11. nondeterm member_nn(i,nodes)
  12. graph(nodes,edges)
  13. nondeterm path(i,i,G,ilist)
  14. nondeterm path1(i,ilist,G,ilist)
  15. nondeterm adjacent(integer,integer,G)
  16. nondeterm covers(ilist,G)
  17. nondeterm node(i,G)
  18. nondeterm hamiltonian(G,ilist)
  19. clauses
  20. graph([1,2,3,4,5],[e(1,2),e(2,3),e(3,4),e(4,5)]).
  21. path(A,Z,G,Path) :- path1(A,[Z],G,Path).
  22. path1(A,[A|Path1],_,[A|Path1]).
  23. path1(A,[Y|Path1],G,Path]:-adjacent(X,Y,G),not(member_n(X,Path1)),
  24. path1(A,[X,Y|Path1],G,Path).
  25. adjacent(X,Y,graph(_,Edges)):- member_e(e(X,Y),Edges); member_e(e(Y,X),Edges).
  26. hamiltonian(G,Path):-path(_,_,G,Path),covers(Path,G).
  27. covers(Path, G):-
  28. node(N,G),
  29. not(member_n(N, Path)),
  30. !,
  31. fail.
  32. covers(_Path,_G).
  33. node(N,graph(Nodes,_)):- member_nn(N,Nodes).
  34. member_e(X,[X | _]):-!.
  35. member_e(X,[_ | Rest]):-member_e(X,Rest).
  36. member_n(X,[X | _]):-!.
  37. member_n(X,[_ | Rest]):-member_n(X,Rest).
  38. member_nn(X,[X | _]).
  39. member_nn(X,[_ | Rest]):-member_nn(X,Rest).
  40. goal
  41. hamiltonian(graph([1,2,3,4],[e(1,2),e(4,3),e(3,1),e(2,4)]),Path).
Программа выдает ошибки именно в этих 2 строчках.
Листинг программы
  1. adjacent(X,Y,graph(_,Edges)):- member_e(e(X,Y),Edges); member_e(e(Y,X),Edges).
  2. hamiltonian(G,Path):-path(_,_,G,Path),covers(Path,G).
А именно говорит о вызовах adjacent и hamiltonian Подскажите, где копать? Почему неправильно? И как это исправить? Спасибо

Решение задачи: «Гамильтонов путь в графе»

textual
Листинг программы
  1. hamiltonian(G,Path):-path(_,_,G,Path),covers(Path,G).

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

  1. Начинается определение функции hamiltonian с двумя аргументами G и Path
  2. В первой части определения используется функция path, которая принимает 4 аргумента, но в данном коде они не используются
  3. Вторая часть определения - это рекурсивный вызов функции hamiltonian с аргументами G и Path
  4. Последняя часть определения - это проверка, что путь Path покрывает все вершины графа G с помощью функции covers
  5. Функция path не определена в данном коде, поэтому ее можно считать вспомогательной функцией
  6. Функция covers также не определена в данном коде, но она используется для проверки покрытия всех вершин графа G путем Path
  7. В данном коде не определены и другие функции, такие как path/4 и covers/2, поэтому их назначение неизвестно
  8. В коде отсутствует вызов функции hamiltonian, поэтому невозможно проверить ее работу на практике
  9. Код не содержит комментариев или пояснений, поэтому трудно понять его назначение без дополнительной информации

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


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

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

8   голосов , оценка 4.375 из 5

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

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

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