Заменить в списке значение одного элемента

      Комментарии к записи Заменить в списке значение одного элемента отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на списки Заменить в списке значение одного элемента

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 месяц, 1 неделя назад.

  • Автор
    Сообщения
  • #3291

    На форуме рассматривалась функция, заменяющая в списке все элементы с заданным значением на новое – replace, но что если требуется заменить только один (первый) элемент?

    Разработаем на языке Prolog программу для решения задачи:

    Заменить в списке один элемент с одним заданным значением на другое заданное.

    Один из вариантов решения – использовать встроенный предикат select (в Visual Prolog он отсутствует, но по ссылке можно найти реализацию). С его помощью можно получить множество решений, в каждом из которых заменен один элемент исходного списка. Первое решение будет таким, в котором заменен первый элемент с заданным значением.

    domains 
    	list = integer*
    predicates
      	change_single_list_element(list, integer, integer, list)
    clauses
      	change_single_list_element([], _A, _B, []):-!.
      	change_single_list_element([A|Tail], A, B, [B|Tail]):-!.
      	change_single_list_element([Head|Tail], A, B, [Head|ChangedTail]):-
      		change_single_list_element(Tail, A, B, ChangedTail).
    goal
      	change_single_list_element([1,2,3,4,5,1,2,3,4,5],3,6,X).

    change_single_list_element

    Из списка выбираются элементы до тех пор, пока очередной элемент не совпадет с искомым (при этом этот элемент будет первым) — тогда в качестве результата возвращается исходный список с замененным первым элементов.
    Если элемент не совпал с заменяемым значением — остальные элементы обрабатываются рекурсивно, а этот (выбранный) элемент дописывается к результату без изменения.
    Если список кончится до того, как встретится элемент — заменять ничего не надо, т. к. в списке просто нет элемента с заменяемым значением.

Для ответа в этой теме необходимо авторизоваться.