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

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

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

Уже запутался делать, нужна помощь. Иногда находит правильно, иногда нет, не могу понятно как исправить.
Листинг программы
  1. process('4'):-
  2. write(" 4. Нахождение в строке самого короткого слова."),nl,
  3. write(" Введите строку: "),
  4. read_list_s(List1),
  5. find_longest_str(List1,Word,Word1),
  6. write(" Первый элемент - ",Word),nl,
  7. write(" Второй элемент - ",Word1),nl,
  8. readchar(_),!.
  9. read_list_s([H|T]):-
  10. readln(H),
  11. H<>"",
  12. read_list_s(T).
  13. read_list_s([]).
  14.  
  15. find_longest_str([S,S1],S,S1).
  16. find_longest_str([S1,S2,S3],S1,S2):-
  17. str_len(S1,L1),
  18. str_len(S2,L2),
  19. str_len(S3,L3),
  20. L1<=L2,
  21. L3<=L2.
  22. find_longest_str([S1,S2,S3],S2,S3):-
  23. str_len(S1,L1),
  24. str_len(S2,L2),
  25. str_len(S3,L3),
  26. L1>L2,
  27. L3<L1.
  28. find_longest_str([H1,H2,H3|T],Max,Max1):-
  29. str_len(H1,L1),
  30. str_len(H2,L2),
  31. str_len(H3,L3),
  32. L1<=L2,
  33. L3<=L2,
  34. find_longest_str([H1,H3|T],Max,Max1).
  35. find_longest_str([H1,H2,H3|T],Max,Max1):-
  36. str_len(H1,L1),
  37. str_len(H2,L2),
  38. str_len(H3,L3),
  39. L1>L2,
  40. L3<L1,
  41. find_longest_str([H2,H3|T],Max,Max1).

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

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6.  
  7. min_elt(intl,int)
  8. del_all(intl,int,intl)
  9. task(intl,int,int)
  10.  
  11. clauses
  12.  
  13. min_elt([H],H).
  14. min_elt([H|T],H) :- min_elt(T,Q), H<Q.
  15. min_elt([H|T],Q) :- min_elt(T,Q), H>=Q.
  16.  
  17. del_all([],_,[]).
  18. del_all([H|T],H,Q) :- del_all(T,H,Q).
  19. del_all([Q|T],H,[Q|P]) :- Q<>H, del_all(T,H,P).
  20.  
  21. 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

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

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

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