Из строки удалить цифры

      Комментарии к записи Из строки удалить цифры отключены

Помечено: ,

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

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

    questioner
    Участник

    Здравствуйте. Помогите, пожалуйста, решить задачу:

    задан список слов, каждое из которых представляет комбинацию букв и цифр. Из каждой строки удалить все цифры, и не содержащие цифр строки записать в новый список. Результат сохранить в файле.

    Решение требуется на Visual Prolog. Я могу только задать список и сохранить результат в файле. Помогите.

    implement main
        open core, console, string, file
    domains
        list = elements*.
        elements = string*.
    class facts
        num:(char).
    class predicates
        write_list : (outputStream, string*).
    clauses
        num('0').
        num('1').
        num('2').
        num('3').
        num('4').
        num('5').
        num('6').
        num('7').
        num('8').
        num('9').
        write_list(_,[]).
        write_list(Out,[H|Tail]):-Out:write(H," "),write_list(Out,Tail).
        run():-
        L1=["Как-то123","1в1","пол25ночь","2в3","ч11ас","угр23юмый","утом11ившись","о1т","раз159думий","Задр423емал","1я","на15д","стран753ицей","фоли142анта","одн759ого"],
        _=readLine(),
            Out = outputStream_file::create8("OutFile.txt"),
        write_list(Out,L1),nl,write("Результат сохранен в файле OutFile.txtn"),fail;
        _=readLine().
    end implement main
    goal
        mainExe::run(main::run).

  • #1768

    Вам нужно 2 предиката. Предикат обработки списка должен для каждого элемента вызывать предикат для обработки слова и результат поместить в новый список.

    list_handler([], []):-!.
    list_handler([Head|Tail], [HeadResult, TailResult]):-
      word_handler(Head, HeadResult), list_handler(Tail, TailResult).

    Второй предикат обрабатывает слово и удаляет из него цифры. Я пишу на SWI Prolog и строки там обрабатываются немного иначе.
    word_handler(InputString, ResultString):-
      NOT(frontchar(InputString,Char,StringTail)), !,
      ResultString = "".
    word_handler(InputString, ResultString):-
      frontchar(InputString,Char,StringTail), is_digit(Char), !,
      word_handler(InputsString, ResultString).
    word_handler(InputString, ResultString):-
      frontchar(InputString,Char,StringTail),
      word_handler(InputsString, TResultString),
      frontchar(ResultString,Char, TResultString).

    Это не лучший код, т.к. frontchar вызывается трижды для каждой буквы. Возможно стоит написать вспомогательный предикат, принимающий символ и часть слова. Такой предикат должен приделать символ к слову, если символ не является цифрой.

    Тут используется is_digit для проверки того, является ли символ цифрой. Если в Visual Prolog нет такого встроенного предиката — используйте num (он определен в вашем коде).

    Предикат frontchar принимает на вход строку, символ и результирующую строку. И работает следующим образом:
    1) если задана только исходная строка и она пуста — правило завершается неудачей;
    2) если задана только исходная строка и она не пуста — то функция вернет первый символ и остаток строки (именно таким образом у нас перебираются символы строки);
    3) если задана результирующая строка и символ — то формируется исходная строка как Символ + Результирующая_строка. Это используется при формировании строки из символов, не являющихся цифрами.

    Код не проверял, т.к. Linux у меня, не работает тут Visual Prolog, но в SWI Prolog нет никаких frontchar и прочего…

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