Найти циклический маршрут, длина которого не меньше заданного числа - 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).
Кто-нибудь может помочь исправить эти ошибки? Заранее спасибо!
Листинг программы
- reys(m,p).
- reys(m,n).
- reys(m,v).
- reys(p,l).
- reys(p,n).
- reys(n,m).
- reys(n,s).
- reys(n,l).
- reys(v,s).
- reys(s,n).
- path(A,B,[A|T]) :-
- path1(A,B,[],T),
- unic(T).
- 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|T]):-
- path(X, X, [X|T]), unic(T).
- unic([]):-
- !.
- unic([H|T]):-
- member(H,T),!,fail.
- unic([_|T]):-
- !,unic(T).
- piz(:-
- cycle(,
- length(X, Len),
- Len >= 3+2.
- spisok_reysov(X, L) :-
- setof(X, piz(, L).
- test2(L) :-
- spisok_reysov(X, 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д