Удвоить одиночные символы в строке на Prolog

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

Помечено: ,

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

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

    questioner
    Участник

    Нужна помощь в решении задачи. Необходимо создать предикат, который удваивает все одиночные символы в строке.

  • #1793

    Что такое «Одиночный символ»? Это может быть, например:

    • каждый символ;
    • символ, который встречается в строке один раз;
    • символ, окруженный пробелами (и другими «разделителями»).

    Код, который Вы привели не поможет (переделать его явно труднее чем написать новый). Вроде бы приведенный код вообще не работает — функция delete_all выполняет что-то непонятное.

    • #1794

      questioner
      Участник

      Имеется ввиду символ, который встречается в строке 1 раз. Например строка «bomo122» должна преобразоваться в «bbommo1122»

      • #1795

        На SWI Prolog это выглядит так:

        rm_single([], _Buffer, []):-!.
        rm_single([Head|Tail], Buffer, [Head|TailResult]):-
        member(Head, Tail), !, rm_single(Tail, [Head|Buffer], TailResult);
        member(Head, Buffer), !, rm_single(Tail, [Head|Buffer], TailResult).
        rm_single([Head|Tail], Buffer, [Head,Head|TailResult]):-
        rm_single(Tail, [Head|Buffer], TailResult).

        Ваш код написан на Visual Prolog или на Turbo Prolog, однако, rm_single должен там работать абсолютно также. На вход подается список символов, пустой список и результат. В Вашем примере уже есть правило list_str — сначала вызываете его, а результат подаете на rm_single.

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

        • #1796

          questioner
          Участник

          Не получается всё это собрать в одну программу. Не могли бы код полностью написать?

          • #1797

            На Visual Prolog:

            domains
            list=char*
            predicates
            str_list(string, list)
            list_str(list,string)
            rm_single(list, list, list)
            member(char, list)
            clauses
            str_list("",[]):-!.
            str_list(S1,[H|T]):-
            frontchar(S1,H,Str1), str_list(Str1,T).
            list_str([],""):-!.
            list_str([H|T],S):-
            list_str(T,S1),frontchar(S,H,S1).
            member(H, [H|_]):-!.
            member(E, [_|T]):-
            member(E, T).
            rm_single([], _Buffer, []):-!.
            rm_single([Head|Tail], Buffer, [Head|TailResult]):-
            member(Head, Tail), !, rm_single(Tail, [Head|Buffer], TailResult);
            member(Head, Buffer), !, rm_single(Tail, [Head|Buffer], TailResult).
            rm_single([Head|Tail], Buffer, [Head,Head|TailResult]):-
            rm_single(Tail, [Head|Buffer], TailResult).
            goal
            write("Enter string :"),nl,
            readln(S),
            str_list(S, L),
            rm_single(L, [], List),
            list_str(List, Str),
            write("S=", Str).

            Тут предикаты list_str и str_list эквивалентны стандартной функции string_to_list из SWI Prolog. Написаны потому, что в Turbo Prolog и Visual Prolog нет таких стандартных функций.

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