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

Помечено: , ,

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

Просмотр 6 сообщений - с 1 по 6 (из 6 всего)
  • Автор
    Сообщения
  • #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" — завершаем работу (выполнив отсечение, т.к. найдено единственное решение). В противном случае отделяем от строки слово, сохраняя его значение в анонимную переменную (задаваемую символом подчеркивания), т.к. оно нам не потребуется. В остальной части строки выполняем рекурсивную проверку.

Просмотр 6 сообщений - с 1 по 6 (из 6 всего)

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