предикат
bound(Y)
приводит к тому же результату, если переменная Y связана.
Теперь мы готовы приступить к тому, что называется
определение предиката divide (разбить), который разбивает
слово на слоги. Такой предикат имеет четыре параметра и опре-
деляется рекурсивно. Первые два параметра содержат, соответс-
твенно, начало (start) и остаток (Remainder) заданного слова
в процессе рекурсии. Два последних параметра возвращают, со-
ответственно, первую и последнюю части слова после того, как
оно уже разбито на слоги.
Первое правило для предиката divide имеет следующий вид:
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],[ol,lp,r,o]).
Предикат append используется здесь для присоединения первой
звонкой к началу слова. Третий параметр предиката divide ста-
новится связанным со списком , а четвертый - со спис-
ком .
Всю полную программу иллюстрирует программа 56.
/* Программа 56 */
domains
letter = symbol
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 word: "),readln(S),string_word(S,Word),
append(First,Second,Word),
divide(First,Second,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),