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

Объяснение кода листинга программы

  1. domains определяют типы данных для переменных: int - целое число, intl - список целых чисел, intll - список списков целых чисел.
  2. predicates определяют функции, которые могут быть рекурсивно вызваны:
    • is_in(intl,intl) - проверка, содержится ли элемент в списке.
    • pos_in(intl,intl,int) - поиск позиции элемента в списке.
    • sum(intl,int) - вычисление суммы элементов списка.
    • all_lst(intl,intl,intl,intll) - рекурсивный поиск общих подсписков.
    • max_sum(intll,intl) - поиск максимальной суммы подсписка.
  3. 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.
  4. 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 - вычисление суммы элементов подсписка и вывод суммы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.5 из 5
Похожие ответы