Поиск максимального общего подсписка в списках - Prolog
Формулировка задачи:
Добрый день! (Или ночь). Всех наступившим Новым Годом!
Прошу помощи в решении следующей задачи:
Мне необходимо найти максимальный подсписок из трёх элементов в ТРЁХ списках.
Дано:
На выходе: найденный подсписок, порядковый номер начала искомого подсписка в каждом списке, сумма элементов.
Не знаю даже с чего начать...
Решение задачи: «Поиск максимального общего подсписка в списках»
textual
Листинг программы
domains int=integer intl=int* intll=intl* predicates is_in(intl,intl) pos_in(intl,intl,int) sum(intl,int) all_lst(intl,intl,intl,intll) max_sum(intll,intl) clauses is_in(_,[_,_]) :- fail. is_in([X1,X2,X3],[X1,X2,X3|_]). is_in([X1,X2,X3],[_|T]) :- is_in([X1,X2,X3],T). pos_in([X1,X2,X3],[X1,X2,X3|_],1) :- !. pos_in([X1,X2,X3],[_|T],P) :- pos_in([X1,X2,X3],T,P1), P=P1+1. sum([X1,X2,X3],S) :- S=X1+X2+X3. all_lst([_,_],_,_,[]). all_lst([X1,X2,X3|T],Y,Z,[[X1,X2,X3]|R]) :- is_in([X1,X2,X3],Y), is_in([X1,X2,X3],Z), all_lst([X2,X3|T],Y,Z,R), !. all_lst([_,X2,X3|T],Y,Z,R) :- all_lst([X2,X3|T],Y,Z,R), !. max_sum([H],H). max_sum([H|T],Q) :- max_sum(T,Q), sum(H,Z), sum(Q,U), U>=Z. max_sum([H|T],H) :- max_sum(T,Q), sum(H,Z), sum(Q,U), U<Z. goal L1=[2,3,4,10,22,11,17], L2=[1,2,3,4,10,22,11,11,10,24], L3=[2,3,4,5,10,23,10,22,11,17], all_lst(L1,L2,L3,R), max_sum(R,U), write(U), nl, pos_in(U,L1,P1),pos_in(U,L2,P2),pos_in(U,L3,P3),W=[P1,P2,P3],write(W),nl, sum(U,S), write(S), nl.
Объяснение кода листинга программы
domains
определяют типы данных для переменных:int
- целое число,intl
- список целых чисел,intll
- список списков целых чисел.predicates
определяют функции, которые могут быть рекурсивно вызваны:is_in(intl,intl)
- проверка, содержится ли элемент в списке.pos_in(intl,intl,int)
- поиск позиции элемента в списке.sum(intl,int)
- вычисление суммы элементов списка.all_lst(intl,intl,intl,intll)
- рекурсивный поиск общих подсписков.max_sum(intll,intl)
- поиск максимальной суммы подсписка.
clauses
определяют правила для функций:is_in(_,[_,_]) :- fail.
: если элемент не содержится в списке, то вызывается функцияfail
.is_in([X1,X2,X3],[X1,X2,X3|_])
: если элемент содержится в списке, то он добавляется в конец списка.is_in([X1,X2,X3],[_|T]) :- is_in([X1,X2,X3],T)
: если элемент не содержится в списке, то он рекурсивно ищется в оставшейся части списка.pos_in([X1,X2,X3],[X1,X2,X3|_],1) :- !.
: если элемент содержится в списке, то его позиция равна 1.pos_in([X1,X2,X3],[_|T],P) :- pos_in([X1,X2,X3],T,P1), P=P1+1.
: если элемент не содержится в списке, то его позиция равна сумме позиции в списке и 1.
goal
определяет задачу:L1=[2,3,4,10,22,11,17], L2=[1,2,3,4,10,22,11,11,10,24], L3=[2,3,4,5,10,23,10,22,11,17]
- списки, в которых ищется общий подсписок.all_lst(L1,L2,L3,R), max_sum(R,U)
- вызов функцииall_lst
для поиска общего подсписка и функцииmax_sum
для вычисления максимальной суммы подсписка.write(U), nl
- вывод максимальной суммы подсписка.pos_in(U,L1,P1),pos_in(U,L2,P2),pos_in(U,L3,P3),W=[P1,P2,P3],write(W),nl
- поиск позиции элемента в общем подсписке и вывод позиции.sum(U,S), write(S), nl
- вычисление суммы элементов подсписка и вывод суммы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д