Найти циклический маршрут, длина которого не меньше заданного числа - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д