Построить программу "сжать", назначение которой - преобразование английских слов в их "звуковой" код - Prolog
Формулировка задачи:
Всем привет . Не могли бы помочь решить данную задачу ?) Построить программу "сжать", назначение которой - преобразование английских слов в их "звуковой" код. Этот процесс предусматривает "сжатие" примерно одинаково звучащих слов в одинаковый их код - своего рода, аббревиатуру этих слов. Слова "сжимаются" в соответствии со следующими правилами:
• первая буква слова сохраняется;
• все последующие за ней гласные, а также буквы "h", "w" и "y" удаляются;
• сдвоенные буквы заменяются одиночными;
• закодированное слово состоит не более чем из четырех букв, остальные буквы удаляются.
Примеры: сжать(barrington, brng) и сжать(llewellyn, ln) - выполнено.
Указание. Воспользуйтесь предикатом name/2.
Решение задачи: «Построить программу "сжать", назначение которой - преобразование английских слов в их "звуковой" код»
textual
Листинг программы
p(_,_,[],[]). p(3,_,_,[]). p(A,B,[C|D],E):- member(C,"aeiouhwy"), p(A,B,D,E). p(A,B,[B|C],D):- p(A,B,C,D). p(A,_,[C|D],[C|E]):- F is A+1, p(F,C,D,E). res(X,Y):-name(X,[X2|X3]), p(0,X2,X3,Y3), name(Y,[X2|Y3]).
Объяснение кода листинга программы
- Начинается с двух пустых списков, один для входных данных, другой для результатов.
- Используется функция
p/4, которая принимает четыре аргумента:AиB- индексы, которые используются для обработки следующего слова.C- текущее слово.D- список звуков слова.E- список звуков слова, который будет использоваться в качестве результата.
- Если текущее слово является гласной (a, e, i, o, u, h, w, y), функция
pрекурсивно вызывается с аргументамиA+1иC, чтобы обработать следующее слово. - Если текущее слово является согласной (не является гласной), функция
pрекурсивно вызывается с аргументамиA+1иC, чтобы обработать следующее слово. - Если текущее слово является конечным, функция
pвозвращает пустой список для звуков слова. - Используется функция
res/2, которая принимает два аргумента:X- имя входного слова.Y- имя выходного слова.- Функция
name/3используется для разбиения имени на отдельные слова. - Функция
pвызывается с аргументами0,X2(первое слово входного имени) иX3(остальные слова входного имени), гдеX2иX3передаются в функциюres. - Функция
nameвызывается снова, на этот раз с аргументамиYиY3(результат функцииp), чтобы объединить имя выходного слова из отдельных звуков.