Удаление из второй строки повторных символов из первой

      Комментарии к записи Удаление из второй строки повторных символов из первой отключены

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

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

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

    juliia93
    Участник

    Задание:

    Создайте предикат, удаляющий из второй строки все повторные вхождения из первой строки

    Вот у меня получился код для удаления повторяющихся символов из первой строки, как его поменять на нужный?

    domains
      str=string
    predicates
      removeall(char,str,str)
      udalit(str, str)
    clauses
      removeall(_,"","").
      removeall(C,S,R):- 
        frontchar(S,C,RS), 
        removeall(C,RS,R),!.
      removeall(C,S,R):- 
        frontchar(S,Q,RS), 
        removeall(C,RS,RR), 
        frontchar(R,Q,RR).
    
      udalit("","").
      udalit(S,R):- 
        frontchar(S,A,RS), 
        removeall(A,RS,RRS), 
        udalit(RRS,RR), 
        frontchar(R,A,RR).
    goal
      write("Введите строку"), nl,
      readln(S),
      udalit(S,R), write(R).

  • #3467

    В вашей задаче не нужно удалять повторяющиеся символы из первой строки. Вместо этого, наоборот нужно сформировать из этих элементов список (Repeated), а затем удалить из второй строки все элементы, входящие в этот список. Выбрать повторяющиеся элементы можно с помощью функции repeated_symbols.

    После этого, вам нужно последовательно перебирать символы строкой строки и проверять их наличие среди элементов Repeated. Если символ присутствует — то к результату его добавлять не следует:

    strings_subtraction("", _B, ""):-!.
    strings_subtraction(A, B, AMinusB):-
      frontchar(A, HeadA, TailA),
      symbol_of_string(B, HeadA), !,
      strings_subtraction(TailA, B, AMinusB).
    strings_subtraction(A, B, AMinusB):-
      frontchar(A, HeadA, TailA),
      strings_subtraction(TailA, B, TailAMinusB),
      frontchar(AMinusB, HeadA, TailAMinusB).

    Тогда решение вашей задачи, при условии что исходные строки находятся в переменных A и B, будет выглядеть так:

    repeated_symbols(A, RepeatedA),
    strings_subtraction(B, RepeatedA, X).

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