Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Деление слов на слоги

С помощью очень простого алгоритма мы можем написать программу, ко-

торая может делить слова на слоги, просматривая последовательность появ-

ления согласных и гласных букв в каждом слове. Рассмотрим, например, две

следующие последовательности:

1. гласная согласная гласная

В этом случае слово разделяется после первой гласной. Это правило

можно, например, применить к следующим словам:

ruler > ru-ler

prolog > pro-log

2. гласная согласная согласная гласная

В этом случае слово делится между двумя согласными. Например:

number > num-ber

turbo > tur-bo

console > con-sole

Эти два правила годятся для большинства слов, но не подходят для

слов handbook и hungry, которые не попадают под эти два шаблона. Для раз-

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

жащий все на свете слова.

Давайте напишем программу, которая делит слова на слоги. Вначале она

будет предлагать вам ввести какое-нибудь слово, а затем будет пытаться

разделить его на слоги с помощью двух указанных правил. Как мы уже виде-

ли, это не всегда будет приводить к правильному результату.

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

му нам в секции domains нужно объявить

domains

letter = symbol

word = letter

Нам также необходим предикат, который будет определять какая это

буква - гласная или согласная. К гласным относятся следующие буквы a, e,

i, o, u плюс буква y. Следовательно, мы можем записать

vocal(a). vocal(e). vocal(i). vocal(o). vocal(u). vocal(y).

для предиката vocal.

Согласные можно определить как буквы, не являющиеся гласными:

consonant(L) if not(vocal(L)).

Нам также необходимы два предиката. Первый - append.

append(word, word, word)

Во-вторых нам необходим предикат для преобразования строки в список

из букв

string_word(string,word)

В этом предикате используется стандартный предикат frontchar (опи-

санный в главе 13), а также стандартные предикаты free и bound, где

free(X) выполняется успешно, если х является свободной переменной в мо-

мент обращения, а bound(X) выполняется успешно, если х - ограниченная пе-

ременная.

Теперь мы можем начать наступление на основную задачу: описание пре-

диката divide, который делит слово на слоги. Предикат divide содержит че-

тыре параметра и определяется рекурсивно. Первый и второй параметры со-

держат, соответственно, начало Start и остальную часть слова Reminder во

время выполнения рекурсии. Последние два параметра возвращают, соответст-

венно, первую и последнюю часть слова после того, как слово разбито на

слоги.

Например, первое правило разбиения таково

divide(Start,[T1,T2,T3|Rest], D, [T2,T3|Rest]) :-

vocal(T1),consonant(T2),vocal(T3),

append(Start,[T1],D).

где Start представляет собой список первой группы букв в разделяемом сло-

ве. Следующие три буквы в слове представлены переменными Т1, Т2 и Т3 со-

ответственно, а Rest представляет остальные буквы в слове. В списке D

буквы Т2 и Т3, а также список Rest представляют последовательность всех

букв, входящих в состав слова. Слово делится на слоги, у которых послед-

ние буквы содержатся в списке D.

Это правило может быть проверено с помощью следующего целевого ут-

верждения

divide([p,r],[o,l,o,g],P1,P2)

Для того, чтобы увидеть как это происходит, давайте введем соответс-

твующие буквы в предложение

divide([p,r],[o,l,o|[g]],[p,r,o],[l,o|[g]]):-

vocal(o),consonant(l),vocal(o),

append([p,r],[o],[p,r,o]).

append применяется для конкатенации первой гласной в начале слова.

P1 получает значение [p,r,o], а Р2 значение [l,o,g].

Второе правило для divide приведен в полном тексте программы

CH18EX06.PRO.

/* Program CH18EX06.PRO */

letter = char

word = letter*

predicates

divide(word, word, word, word)

vocal(letter)

consonant(letter)

string_word(string,word)

append(word, word, word)

repeat

goal

clearwindow,

repeat,

write("Write a multi-syllable word:"),

readln(S),

string_word(S, Word),

divide([], Word, Part1, Part2),

string_word(Syllable1, Part1),

string_word(Syllable2, Part2),

write("Division: ",Syllable1,"-",Syllable2),nl,

fail.

clauses

divide(Start, [T1, T2, T3|Rest], D1, [T2, T3|Rest]):-

vocal(T1), consonant(T2), vocal(T3),

append(Start, [T1], D1).

divide(Start, [T1, T2, T3, T4|Rest], D1,[T3, T4|Rest]):-

vocal(T1), consonant(T2), consonant(T3), vocal(T4),

append(Start, [T1, T2], D1).

divide(Start, [T1|Rest], D1, D2):-

append(Start, [T1], S),

divide(S, Rest, D1, D2).

vocal('a').vocal('e').vocal('i').

vocal('o').vocal('u').vocal('y').

consonant(B) :- not(vocal(B)), B <= 'z', 'a' <= B.

string_word("", []) :- !.

string_word(Str, [H|T]) :-

bound(Str), frontchar(Str, H, S), string_word(S, T).

string_word(Str, [H|T]) :-

free(Str), bound(H), string_word(S, T), frontchar(Str,H,S).

append([], L, L) :- !.

append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).

repeat.

repeat :- repeat.

Соседние файлы в папке Документация