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