Нахождение в списке двух наименьших элементов (доделать программу) - Prolog

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

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

Уже запутался делать, нужна помощь. Иногда находит правильно, иногда нет, не могу понятно как исправить.

Решение задачи: «Нахождение в списке двух наименьших элементов (доделать программу)»

textual
Листинг программы
domains
int=integer
intl=int*
 
predicates
 
min_elt(intl,int)
del_all(intl,int,intl)
task(intl,int,int)
 
clauses
 
min_elt([H],H).
min_elt([H|T],H) :- min_elt(T,Q), H<Q.
min_elt([H|T],Q) :- min_elt(T,Q), H>=Q.
 
del_all([],_,[]).
del_all([H|T],H,Q) :- del_all(T,H,Q).
del_all([Q|T],H,[Q|P]) :- Q<>H, del_all(T,H,P).
 
task(H,M1,M2) :- min_elt(H,M1), del_all(H,M1,Z), min_elt(Z,M2).

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

В коде реализованы три функции:

  1. min_elt/2 - находит минимальный элемент в списке. Если список пустой, то возвращает сам список. Если в списке есть элемент, то рекурсивно вызывает себя, сравнивая текущий элемент со следующим. Если текущий элемент больше следующего, то возвращает следующий элемент. Если текущий элемент меньше или равен следующему, то возвращает текущий элемент.
  2. del_all/3 - удаляет все вхождения указанного элемента из списка. Если список пустой, то возвращает пустой список. Если в списке есть элемент, то рекурсивно вызывает себя, удаляя указанный элемент из списка. Если элемент не найден, то возвращает исходный список.
  3. task/3 - находит два наименьших элемента в списке. Сначала находит минимальный элемент с помощью min_elt/2, затем удаляет все его вхождения из списка с помощью del_all/3, затем находит новый минимальный элемент в получившемся списке с помощью min_elt/2.

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


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

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

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