Поиск слов с одной буквой на Prolog

      Комментарии к записи Поиск слов с одной буквой на Prolog отключены

Помечено: , ,

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

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

    Nika
    Участник

    Дана строка. Проверьте, есть ли в ней слова, содержащие только одну букву «g».

  • #2648

    Здравствуйте. Что именно у вас не получается и на каком диалекте пролога нужно решение задачи?

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

    check_single_g(String):-
      string_to_words(String, Words),
      member(Word, Words),
      count(Word, 0'g, 1).

    Я привел код для SWI Prolog, но на форуме есть предикаты, с помощью которых вы сможете адаптировать решение под любой другой диалект. Если вы пишите на Turbo Prolog, то предварительно нужно строку преобразовать в список символов и добавить в свою программу функцию member. 0'g в моей программе задает искомый символ (это не тоже самое, что «g»), т.к. последний вариант в SWI Prolog задаст список из одного символа, а в Turbo Prolog — специальный тип строки.

  • #2652

    Nika
    Участник

    Нужно решение на Visual Prolog — мне не обязательно преобразовывать строку в список?
    Мне можно использовать только предикаты, позволяющие обрабатывать строки. Как решить задачу в этом случае?

    • #2654

      На Visual Prolog, как и на Turbo Prolog у строк особый тип (они не являются списком) — поэтому их нужно преобразовать. К слову, на SWI Prolog тоже есть такой тип, но он преобразуется в список стандартным предикатом.

      Вам нельзя вообще использовать списки или нельзя использовать какие-то стандартные предикаты? — все нужные предикаты для работы со списками вы можете взять на форуме (да их и так нет в Visual Prolog). Вам вообще нельзя использовать списки или запрещено только преобразовывать строку в список символов? — все-таки, в вашей задаче очень удобно использовать список слов.

      Вообще, в Visual Prolog нормально работает функция fronttoken для выделения первого слова строки и задача тогда тоже решается красиво. Вы пробовали решить задачу сами? — где Ваш код?

  • #2671

    Nika
    Участник

    Да, вариант с fronttoken — идеально.

    Я пробовала решать более простенькие задачи. А с этими у меня сложности.

    • #2675

      Для подсчета вхождений символа g в строку (слово) примените функцию count для строк в Turbo Prolog.
      Тогда, все что остается сделать — попросить интерпретатор найти такое слово (отделяемое fronttoken), что count вернет для него единицу:

      check_single_g(String):-
        fronttoken(String, HeadWord, TailString),
        count(HeadWord, "g", 1), !.
      check_single_g(String):-
        fronttoken(String, _, TailString),
        check_single_g(TailString).

      Мы отделяем первое слово строки, если в нем единственная буква "g" — завершаем работу (выполнив отсечение, т.к. найдено единственное решение). В противном случае отделяем от строки слово, сохраняя его значение в анонимную переменную (задаваемую символом подчеркивания), т.к. оно нам не потребуется. В остальной части строки выполняем рекурсивную проверку.

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