Найти циклический маршрут, длина которого не меньше заданного числа - Prolog

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

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

Друзья, прошу помощи в исправлении моего кода. Задание звучит так: В примере выполнения данной части ДЗ дан список пар городов, между которыми есть авиарейсы. Найти циклический маршрут, длина которого (по количеству промежуточных пунктов) не меньше заданного числа. Вот, что у меня получилось.
Листинг программы
  1. reys(m,p).
  2. reys(m,n).
  3. reys(m,v).
  4. reys(p,l).
  5. reys(p,n).
  6. reys(n,m).
  7. reys(n,s).
  8. reys(n,l).
  9. reys(v,s).
  10. reys(s,n).
  11. path(A,B,[A|T]) :-
  12. path1(A,B,[],T),
  13. unic(T).
  14. path1(A,B,_,[B]) :-
  15. reys(A,.
  16. path1(A,B,K,[C|L]) :-
  17. reys(A,C),
  18. not(member((C,,K)),
  19. path1(C,B,[(C,|K],L).
  20. cycle([X|T]):-
  21. path(X, X, [X|T]), unic(T).
  22.  
  23. unic([]):-
  24. !.
  25. unic([H|T]):-
  26. member(H,T),!,fail.
  27. unic([_|T]):-
  28. !,unic(T).
  29. piz(:-
  30. cycle(,
  31. length(X, Len),
  32. Len >= 3+2.
  33. spisok_reysov(X, L) :-
  34. setof(X, piz(, L).
  35. test2(L) :-
  36. spisok_reysov(X, L).
Не компилируются 3 фрагмента: ! Error 42 : Syntax Error ! | ! | path1(A,B,_,[B]):-reys(A,. ! | <HERE>path1(A,B,K,[C|L]):-reys(A,C),not(member((C,,K)),path1(C,B,[(C,|K],L). ! ---------------------------------------- ! Error 42 : Syntax Error ! | ! | piz(:-cycle<HERE>(,length(X, Len),Len >= 3+2. ! ---------------------------------------- ! Error 42 : Syntax Error ! | ! | spisok_reysov(X, L):-setof(X, piz(,<HERE> L). Кто-нибудь может помочь исправить эти ошибки? Заранее спасибо!

Решение задачи: «Найти циклический маршрут, длина которого не меньше заданного числа»

textual
Листинг программы
  1. reys(m,p).
  2. reys(m,n).
  3. reys(m,v).
  4. reys(p,l).
  5. reys(l,n).
  6. reys(n,m).
  7. reys(n,s).
  8. reys(n,l).
  9. reys(v,s).
  10. reys(s,n).
  11.  
  12. path(A,B,[A|Z]) :-
  13. path1(A,B,[],Z),
  14. unic(Z).
  15. path1(A,B,_,[B]) :-
  16. reys(A).
  17. path1(A,B,K,[C|L]) :-
  18. reys(A,C),
  19. not(member(C,K)),
  20. path1(C,B,[C|K],L).
  21.  
  22. cycle([X|Z]):-
  23. path(X, X, [X|Z]), unic(Z).
  24.  
  25.  
  26. unic([]):-
  27. !.
  28. unic([Y|Z]):-
  29. member(Y,Z),!,fail.
  30. unic([_|Z]):-
  31. !,unic(Z).
  32.  
  33. pyz:-
  34. cycle([]),
  35. length(X, Len),
  36. Len >= 5.
  37.  
  38. spisok_reysov(X, L) :-
  39. setof(X, pyz, L).
  40.  
  41. res2(L) :-
  42. spisok_reysov(X, L).

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

  1. Первый факт reys(m,p) означает, что у нас есть отношение между объектами m и p и они как-то связаны.
  2. Факт reys(m,n) говорит о том, что m и n также связаны.
  3. Факт reys(m,v) говорит о связи между m и v.
  4. Факт reys(p,l) говорит о связи между p и l.
  5. Факт reys(l,n) говорит о связи между l и n.
  6. Факт reys(n,m) говорит о связи между n и m.
  7. Факт reys(n,s) говорит о связи между n и s.
  8. Факт reys(n,l) говорит о связи между n и l.
  9. Факт reys(v,s) говорит о связи между v и s.
  10. Факт reys(s,n) говорит о связи между s и n.
  11. Факт path(A,B,[A|Z]) определяет функцию для поиска пути от A до B с использованием списка промежуточных узлов Z.
  12. Факт path1(A,B,_,[B]) является базовым случаем для функции path1, когда A равен B.
  13. Факт path1(A,B,K,[C|L]) рекурсивно вызывает функцию path1 для каждого элемента C в списке K, пока не будет достигнут конечный пункт B.
  14. Факт cycle([X|Z]):- path(X, X, [X|Z]), unic(Z) используется для определения циклического пути, проверяя, что путь от X до X содержит только уникальные узлы.
  15. Факт unic([]) :- ! определяет пустой список как уникальный.
  16. Факт unic([Y|Z]):- member(Y,Z),!,fail проверяет, что все элементы в списке Z являются уникальными.
  17. Факт unic([_|Z]):- !,unic(Z) рекурсивно вызывает функцию unic для списка Z.
  18. Факт pyz:- cycle([]), length(X, Len), Len >= 5 задает условие для определения пути, который является циклом и имеет длину не менее 5.
  19. Факт spisok_reysov(X, L) :- setof(X, pyz, L) используется для создания списка путей, удовлетворяющих условию pyz.
  20. Факт res2(L) :- spisok_reysov(X, L) используется для вывода списка путей, удовлетворяющих условию pyz.

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


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

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

11   голосов , оценка 4.182 из 5

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

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

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