Ответ в теме: Задача на Visual Prolog. Проверка на наличие слов

      Комментарии к записи Ответ в теме: Задача на Visual Prolog. Проверка на наличие слов отключены
#2849

Перед тем, как начать решать задачу, нужно определиться с тем, что такое “слова”. В решении, которое вы тут привели явно пытались делить строку на слова по пробелам (полагая, что между словами всегда стоит ровно один пробел). Однако, если:

  1. пробелов между словами может быть несколько;
  2. пробелы могут стоять в начале строки;
  3. пробелы могут стоять в конце строки (это отдельная проблема);
  4. слова могут разделяться не только пробелами, но и символами перевода строки или табуляциями, например;

То такое решение не подойдет. Посмотрите функцию разделения строки на список слов – там все подробно описано и это самый простой путь. После того, как список слов получен, найти нужные вам слова очень легко:

find_first_simbol_words([HeadWord|TailWords]):-
  frontchar(HeadWord, "b", _), !;
  find_first_simbol_words(TailWords).

Т.е. мы перебираем слова из списка до тех пор, пока первой буквой очередного слова не окажется нужный нам символ. Если список кончится, то мы не сможем выполнить его разделение на голову и хвост, а значит предикат (как и положено по заданию) завершится неудачей.

Ну а если же вам нужно топорное решение – то ищите в строке сочетание пробел + нужный вам символ для решения задачи:

find_first_simbol_words(String):-
  frontchar(Space, " ", StringWithoutSpace),
  frontchar(StringWithoutSpace, "b", _TailString), !.
find_first_simbol_words(String):-
  frontchar(Space, _HeadSymbol, StringWithoutHead),
  find_first_simbol_words(StringWithoutHead).

Алгоритм тоже очень прост:

  • если первый символ строки пробел, а второй – нужная вам буква, то функция завершается успешно;
  • в противном случае первый символ отбрасывается, а остальная часть строки обрабатывается рекурсивно;
  • если строка кончится, то вызов frontchar для нее завершится неудачей и функция (как и следует, т.к. в пустой строке нет слов, соответствующих условию) тоже завершится неудачей.

Ну а ваши поделки из первого поста мне вообще не понятны. Я даже не знаю с какой стороны начинать читать этот код и какой алгоритм мог пытаться реализовать его автор.