Поиск максимального общего подсписка в списках - Prolog

Узнай цену своей работы

Формулировка задачи:

Добрый день! (Или ночь). Всех наступившим Новым Годом! Прошу помощи в решении следующей задачи: Мне необходимо найти максимальный подсписок из трёх элементов в ТРЁХ списках. Дано:
Листинг программы
  1. list(1,[2,3,4,10,22,11,17]).
  2. list(2,[1,2,3,4,10,22,11,11,10,24]).
  3. list(3,[2,3,4,5,10,23,10,22,11,17]).
На выходе: найденный подсписок, порядковый номер начала искомого подсписка в каждом списке, сумма элементов.
Листинг программы
  1. allign(P, T, S).
  2. P = [4, 5, 7]
  3. T = [10, 22, 11]
  4. S = 43
Не знаю даже с чего начать...

Решение задачи: «Поиск максимального общего подсписка в списках»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. intll=intl*
  5.  
  6. predicates
  7. is_in(intl,intl)
  8. pos_in(intl,intl,int)
  9. sum(intl,int)
  10. all_lst(intl,intl,intl,intll)
  11. max_sum(intll,intl)
  12.  
  13. clauses
  14.  
  15. is_in(_,[_,_]) :- fail.
  16. is_in([X1,X2,X3],[X1,X2,X3|_]).
  17. is_in([X1,X2,X3],[_|T]) :- is_in([X1,X2,X3],T).
  18.  
  19. pos_in([X1,X2,X3],[X1,X2,X3|_],1) :- !.
  20. pos_in([X1,X2,X3],[_|T],P) :- pos_in([X1,X2,X3],T,P1), P=P1+1.
  21.  
  22. sum([X1,X2,X3],S) :- S=X1+X2+X3.
  23.  
  24. all_lst([_,_],_,_,[]).
  25. 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), !.
  26. all_lst([_,X2,X3|T],Y,Z,R) :- all_lst([X2,X3|T],Y,Z,R), !.
  27.  
  28. max_sum([H],H).
  29. max_sum([H|T],Q) :- max_sum(T,Q), sum(H,Z), sum(Q,U), U>=Z.
  30. max_sum([H|T],H) :- max_sum(T,Q), sum(H,Z), sum(Q,U), U<Z.
  31.  
  32. goal
  33.  
  34. 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],
  35. all_lst(L1,L2,L3,R), max_sum(R,U), write(U), nl,
  36. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы