Разобраться в предикате "append" - Prolog

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

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

Помогите разобраться в коде программы. Что в данном примере выполняет предикат "append"? Какой алгоритм его работы?
Листинг программы
  1. /* Программа, образующая “мутанты” из заданных */
  2. /* в базе данных названий животных. Мутант – это слово, */
  3. /* полученное соединением двух слов: конец первого */
  4. /* совпадает с началом второго. */
  5. domains
  6. type = string
  7. lst = char*
  8. predicates
  9. run
  10. style_mutant
  11. mutant(lst)
  12. animal(type)
  13. append(lst, lst, lst)
  14. str_list(type, lst)
  15. print_list(lst)
  16. goal
  17. run.
  18. clauses
  19. run :- write(" Красивые мутанты: \n\n"), style_mutant.
  20. style_mutant :- mutant(X), print_list(X), fail.
  21. mutant(Z) :- animal(XSt), str_list(XSt, X), animal(YSt), str_list(YSt, Y),
  22. append(_, [B|Bs], X), append([B|Bs], [C|Cs], Y),
  23. append(X, [C|Cs], Z).
  24. append([], Xs, Xs).
  25. append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
  26. /* База данных */
  27. animal("крокодил").
  28. animal("лошадь").
  29. animal("черепаха").
  30. animal("карибу").
  31. animal("хамелеон").
  32. animal("волк").
  33. animal("буйвол").
  34. /* ––––––––––––––––– */
  35. str_list("", []).
  36. str_list(Str, [X|Xs]) :-
  37. frontchar(Str, X, Rest),
  38. str_list(Rest, Xs).
  39. print_list([]) :- !, nl.
  40. print_list([X|Xs]) :- write(X), print_list(Xs).

Решение задачи: «Разобраться в предикате "append"»

textual
Листинг программы
  1. % если левый список пуст, то итоговый список совпадает с правым списком
  2. my_append([], RightList, RightList).
  3. % иначе, взять голову из левого списка и перенести в голову итогового списка,
  4. my_append([LeftHead|LeftTeil], RightList, [LeftHead|RightPart]) :-
  5.     % продолжить для хвоста левого списка
  6.     my_append(LeftTeil, RightList, RightPart).

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

Код представляет собой реализацию функции append на языке Prolog.

  1. Если левый список пуст, то есть когда передается пустой список [], тогда итоговый список будет совпадать с правым списком, то есть RightList.
  2. В противном случае, код берет голову из левого списка (обозначено как LeftHead) и переносит ее в голову итогового списка (обозначено как [LeftHead|RightPart]).
  3. Затем код рекурсивно вызывает себя для хвоста левого списка (обозначено как LeftTeil), с обновленными значениями для правого списка (RightList) и правой части итогового списка (RightPart). Таким образом, код работает по принципу разделяй и властвуй, рекурсивно обрабатывая каждую часть списка до тех пор, пока не будет достигнут конец списка.

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


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

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

12   голосов , оценка 4.333 из 5

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

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

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