Нахождение в списке двух наименьших элементов (доделать программу) - 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).
Объяснение кода листинга программы
В коде реализованы три функции:
min_elt/2
- находит минимальный элемент в списке. Если список пустой, то возвращает сам список. Если в списке есть элемент, то рекурсивно вызывает себя, сравнивая текущий элемент со следующим. Если текущий элемент больше следующего, то возвращает следующий элемент. Если текущий элемент меньше или равен следующему, то возвращает текущий элемент.del_all/3
- удаляет все вхождения указанного элемента из списка. Если список пустой, то возвращает пустой список. Если в списке есть элемент, то рекурсивно вызывает себя, удаляя указанный элемент из списка. Если элемент не найден, то возвращает исходный список.task/3
- находит два наименьших элемента в списке. Сначала находит минимальный элемент с помощьюmin_elt/2
, затем удаляет все его вхождения из списка с помощьюdel_all/3
, затем находит новый минимальный элемент в получившемся списке с помощьюmin_elt/2
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д