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

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

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

Друзья, прошу помощи в исправлении моего кода. Задание звучит так: В примере выполнения данной части ДЗ дан список пар городов, между которыми есть авиарейсы. Найти циклический маршрут, длина которого (по количеству промежуточных пунктов) не меньше заданного числа. Вот, что у меня получилось.
Не компилируются 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
Листинг программы
reys(m,p). 
reys(m,n). 
reys(m,v). 
reys(p,l). 
reys(l,n).
reys(n,m). 
reys(n,s). 
reys(n,l). 
reys(v,s). 
reys(s,n).
 
path(A,B,[A|Z]) :-
path1(A,B,[],Z),
unic(Z).
path1(A,B,_,[B]) :-
reys(A).
path1(A,B,K,[C|L]) :-
reys(A,C),
not(member(C,K)),
path1(C,B,[C|K],L).
 
cycle([X|Z]):-
path(X, X, [X|Z]), unic(Z).
 
 
unic([]):-
!.
unic([Y|Z]):-
member(Y,Z),!,fail.
unic([_|Z]):-
!,unic(Z).
 
pyz:-
cycle([]),
length(X, Len),
Len >= 5.
 
spisok_reysov(X, L) :-
setof(X, pyz, L).
 
res2(L) :- 
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
Похожие ответы