Поиск максимального общего подсписка в списках - 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- вычисление суммы элементов подсписка и вывод суммы.