Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Зубенко, Омельчук - Програмування. Поглиблений курс

.pdf
Скачиваний:
58
Добавлен:
07.03.2016
Размер:
5 Мб
Скачать
☆

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

(ПС2 ) Фільтр-термінатор P(x) x Σ* .

Як бачимо, не всі базові елементи термінальні. Односимвольні сло- ва за даним означенням мають вигляд pre(a,ε) ,a Σ . Побудуємо ви-

ведення слова abba в означенні ІО2 :

a,b,ε,pre(a,ε),pre(b,pre(a,ε))(= ba ),pre(b, pre(b,pre(a,ε)))(= bba ), pre(a,pre(b, pre(b,pre(a,ε))))= (abba ) .

Наведемо інше індуктивне означення (ІО2′ ) слів над Σ:

(Б ′ )

ε Σ* – порожнє слово й літери алфавіту Σ є базовими.

2

 

(І ′ )

Визначимо конструктор app : Σ* × Σ → Σ* :

2

app(b1b2...bm ,a )= b1b2...bma .

 

(ПС2 ) Фільтр-термінатор P (x ) x Σ* ■

Приклад 2.35. Бінарні дерева у префіксному поданні (Б-дерева) (ІО3 ). Нехай A = {a1,...,an } – сукупність вершин дерев.

(Б3 ) – порожнє Б-дерево.

(І3 ) Для вершини a A і довільних Б-дерев d1,d2 вираз a (d1,d2 ) є Б-деревом.

Бінарним деревам на рисунку за означенням ІО3 відповідають Б- дерева a (b ( , ),c ( ,d ( , ))) та a ( , ).

a

a

 

b с

d

■

Звернемося тепер до індуктивних означень систем множин (ІОС). Нехай P1 (x1 ),...,Pk (xk ), k ≥1, – фільтри на універсумі U , що виділя-

ють у ньому певні підмножини – сорти елементів U1,...,Uk . При цьому

221

ПРОГРАМУВАННЯ

області істинності сортових фільтрів можуть перетинатися. Індуктив- не означення системи множин M1,...,Mk має вигляд:

(БС) Фіксується певна підмножина M0 U апріорі виділених базо- вих об'єктів.

(ІС) Вибирається певна сукупність {Fi } конструкторів – операцій

на універсумі U . Конструктори за базовими й уже побудованими елементами дозволяють отримувати нові елементи універсума.

(ПС) Вибираються фільтри P1 (x ),...,Pk (x ), k ≥1, що виділяють в універсумі U сорти термінальних елементів T1,...,Tk і здійснюють від-

бір елементів до означуваної системи множини: M

 

def

 

≤ i ≤ k .

i

= P (U * ) 1

 

i

0

 

Приклад 2.36. КВ-мови.

Покажемо, як за допомогою ІОС можна задавати КВ-мови в дано- му алфавіті T = {a1,a2,...,an }. Нехай N = {A1,A2,...,Am } – певний алфа- віт нетерміналів. Універсум U складають натуральні числа й сукуп-

ність (T N )* усіх слів у алфавіті основних і допоміжних символів. Предикат Qi (x ), i =1,m , буде виділяти сорт слів у об'єднаному алфа- віті, що можуть бути виведені з аксіоми Ai . Розглянемо систему мов

L ,...,L

, L

Σ* , що визначається таким ІОС:

 

1

m

 

i

 

 

 

 

 

 

 

 

(БС4 ) Усі

натуральні числа

є базовими.

Кожному нетерміналу

Ai V ,

i =

 

, поставимо у відповідність скінченну непорожню під-

1,m

множину слів

Ri = {u1,...,ur } (Σ V )* . Слова з Ri , i =

 

, – базові. За

1,m

 

 

 

 

i

 

 

 

 

 

 

 

означенням Qi (uj )=1 для всіх j =

 

.

 

 

 

 

1,ri

 

 

 

 

(ІС4 ) Єдиний конструктор Sub : Σ* ×N → Σ*

кожному числу k ≥ 0 і

слову вигляду

u = vA w , де v T *

– префікс u

довжиною k , A

– до-

 

 

 

 

i

 

 

 

 

 

i

vujw ,

поміжний

 

символ, ставить у

відповідність

слова вигляду

j =1,ri . Конструктор залишає слово u без змін у разі відсутності в

ньому термінального префікса довжиною k і наступного за ним до- поміжного символу. За означенням конструктор не змінює сорт слова, тобто слово u передає у спадок новому слову vujw свій сорт.

(ПС4 ) Фільтрами є предикати Pi (x ) Qi (x )& x Σ* , i =1,m .

222

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

Нескладно перевірити, що мови Li , i =1,m , збігаються із сукупніс- тю L(Ai ) усіх слів у алфавіті Σ , що можуть бути лівосторонньо виве- дені у КВ-граматиці з правилами виведення Ai → uj , i =1,m , j =1,ri , із нетермінала Ai як аксіоми ■

2.6.2. ІНДУКТИВНІ ОЗНАЧЕННЯ ФУНКЦІЙ

Індуктивно означені функції й операції (ІОФ) визначаються на ін- дуктивних скінченно означених областях. Необхідно, щоб кожний елемент області визначення можна було розкласти на близькі до нього один або кілька елементів того самого типу. Наприклад, число n +1 розкладається на числа n та 1. ІОФ теж має базу індукції (БФ), індук- тивний перехід (ІФ) і повноту (ПФ). Розглянемо їх спочатку на при- кладі основних операцій на словах.

Операція o : Σ* × Σ* → Σ* – конкатенація слів: (БФ5 ) ε ow2 = w2 oε = w2 .

(ІФ5 ) pre(a,w1 )ow2 = pre(a,w1 ow2 ) для кожного a Σ ,w1,w2 Σ*.

Означення коректне. Воно спирається на той факт, що кожне сло- во складається з його першої літери та хвоста (слова без першої літе- ри). Дійсно, знайдемо, наприклад, значення

cb odd = pre(c,b)odd = pre(c,b odd )= pre(c,pre(b,ε)odd )= = pre(c,pre(b,ε odd ))= pre(c,pre(b,dd ))= pre(c,bdd )= cbdd .

Операція head : Σ* → Σ повертає перший символ (голову) слова, операція bottom : Σ* → Σ – останній символ слова:

(БФ6 ) head (ε)= bottom(ε)= # .

(ІФ6 ) head (aw)= a , bottom(aε)= a , bottom(aw)= bottom(w).

Операція tail : Σ* →Σ* повертає хвіст слова, тобто слово без його голови: (БФ7 ) tail(ε)= ε , (ІФ7 ) tail(aw)= w .

Операція lead : Σ* → Σ* повертає слово без останнього символу: (БФ8 ) lead (ε)= ε (ІФ8 ), lead (aε)= ε , lead (aw)= (w = ε → ε|a lead (w)).

Функція ||: Σ* → N обчислює довжину слова: (БФ9 ) |ε|= 0 , (ІФ9 ) |aw|=1+|w|.

223

(ІФ10 ) u p v =
≤ n . Тоді для довільних v,u Σ+ :
(БФ10 ) (ε p ε) = (ε p v ) =1,(u p ε) =

ПРОГРАМУВАННЯ

Предикат p: Σ* × Σ* → Bool визначає лінійний лексикографічний порядок (нестрогий) на словах над алфавітом Σ = {a1,a2,...,an }. Нага- даємо, що символи алфавіту Σ лінійно впорядковані: ai ≤ a j i ≤ j

для 1 ≤ i, j

0 ,

= (head (u)=head (v )→ tail(u) p tail(v )|head (u) ≤ head (v )).

Наприклад, для довільних символів a,b таких, що a < b :

(ε p a ) =1,(b p ε) = 0 , (ab p ab) = (b p b) = (ε p ε) =1,

(ab p aba ) = (b p ba ) = (ε p a ) =1, (abba p aaa ) = (bba p aa ) = (b p a ) = 0 .

Нехай M = M (M0,{Fi },P ) – певна індуктивна множина зі скінчен- ними множинами твірних і конструкторів.

 

 

Загальне ІОФ функції f : M m → A , визначеної на M , має вигляд:

 

 

(БФ) База індукції.

x M0 : f (x1,...,xm −1,y) = g (x1,...,xm −1,y), де g

– відома функція, визначена на підмножині M m −1 ×M0 .

 

 

 

 

 

 

(ІФ)

Індуктивний

перехід.

Для

кожного

 

конструктора

c : M n → M

із {F }

існує

конструктор

значень

функції

 

 

 

 

 

i

 

 

f (x ,...,x

 

 

,c (y ,...,y ))=

h

c

: M n +m × An → A

такий,

що

m −1

 

 

 

 

 

 

 

1

 

 

1

n

= hc (x1,...,xm −1,y0,...,yn , f (x1,...,xm −1,y1 ),..., f (x1,...,xm −1,yn ))

для

будь-

яких x1,...,xm −1,y0,...,yn M ,y0 = c(y1...,yn ).

 

 

 

 

 

 

 

 

 

(ПФС)

 

 

Повнота

слабка.

Вибирається

певний

фільтр

P (x ,...,x

m −1

,y), визначений на універсумі M m × A , який здійснює від-

 

 

1

 

 

 

 

 

 

 

 

 

 

 

бір результатів означуваної функції.

Увага! Деякі аргументи в конструкторі hc можуть бути фіктивни-

ми, а за конструктор hc можна брати й саму означувану функцію f .

Найчастіше конструктор є умовним, а взагалі він може мати довільну регулярну структуру ►

224

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

∞

За лемою 2.1 M = Mi , де Mi +1 = Mi M%i , а сукупність M%i складають

i=0

усі можливі значення конструкторів {Fi }

на аргументах із Mi , i ≥ 0 . ІОФ

визначає функцію f : Mm → A , графік якої Γ(f )

задається рівностями:

 

def

 

 

 

1)

Γ(f ) = P(H ) ;

 

 

 

 

∞

= Γ(g ), Hi +1 = Hi

H%i , i

 

2)

H = Hi , де H0

≥ 0 ,

 

i =0

 

 

 

H%i = {(x1,...,xm −1,c (y1,...,yn ), hc (x1,...,xm −1,y0,...,yn ,z1,...,zn )): x1,...,xm −1 M ,y1,...,yn Mi , y0 = c (y1,...,yn ),c {Fi },

(x1,...,xm −1,y1,z1 ),...,(x1,...,xm −1,yn ,zn ) Hi )}.

Такі ІОФ задають операцію множення натуральних чисел через до- давання:

(БФ) (x ×0) = 0 , (ІФ) (x ×s (y))= (x ×y) + x

і відому композицію примітивної рекурсії для n -арної натуральної функції f :

(БФ)

f (x1,...xn −1,0) = g (x1,...xn −1 ) для деякої функції g ;

(ІФ)

f (x1,...xn −1,s (y))= h (x1,...xn −1,y, f (x1,...xn −1,y)) для деякого

конструктора h .

Приклад 2.37. Задача про Ханойські вежі.

Є три упорядкованих кілочки, на першому з яких розташована ве- жа з n дисків, яка має вигляд конуса. За один хід можна взяти верх- ній диск із будь-якого кілочка й покласти як верхній на один із решти кілочків за умови, що на останньому не буде порушено умову конус- ності його вежі. Необхідно перенести задану вежу на другий або тре- тій кілочок. Нехай, наприклад, це буде третій кілочок.

Покладемо T = {1,2,3} – номери кілочків.

Нехай Hanoi : T ×T ×N → (T ×T )* – функція, що задає послідовність

дій із переміщення вежі висотою n з одного кілочка на інший. Для подання однієї такої дії достатньо вказати пару чисел вигляду < зві- дки, куди> , що належать T ×T . Нехай "o" – операція конкатенації двох послідовностей. ІОФ11 функції Hanoi основане на індуктивній

природі піраміди: в якому б місці її не поділити навпіл – обидві час-

225

ПРОГРАМУВАННЯ

тини будуть пірамідами, зокрема, якщо взяти її основу й ту частину, що зверху неї. Щоб перенести піраміду з кілочка x на кілочок y , до-

статньо: 1) перенести верхню її частину висотою n −1

на третій кі-

лочок із номером 6 − x − y ; 2) основу перенести

з x

на y ;

3) перенести всю піраміду висотою n −1 із кілочка 6 − x − y

на y . Це

можна записати так:

 

 

(БФ11 ) Hanoi(x,y,1) = (x,y).

 

 

(ІФ11 ) Hanoi(x,y,s(n)) = Hanoi(x,6 − x − y,n ) o

 

o (x,y) oHanoi(6 − x − y,y,n ).

Коректність ІОФ11 просто довести структурною індукцією за n

(див. вправу 15) ■ Індуктивно означені функції будемо називати просто індуктивними.

Зупинимось тепер на правилах обчислення значень індуктивних функцій. Ураховуючи, що замкнення M скінченно породжене і його конструкторів скінченна кількість, для обчислення значення індукти-

вної функції f (x1,...,xm −1,a ) можна було б послідовно будувати всі множини Hi , починаючи з H0 , доти, доки не буде побудовано пару (a, f (a )) Hn для деякого n . Однак така процедура в більшості випа-

дків буде вкрай неефективна.

Раціональніше було б не генерувати виведення всіх можливих еле- ментів замкнення, а знайти одне з виведень саме елемента a в за-

мкненні M і побудувати за ним значення b = f (x1,...,xm −1,a ) за допо- могою відповідних конструкторів. Цю побудову, у свою чергу, можна

подати

у вигляді певного виведення

на

множині

термів

< t0 = f (x1,...,xm −1,a),t1,t2,...,tn = b > . Правило

виведення (отримання

терму ti +1 із терму ti ) може бути таким: усі виклики функції f

у ti од-

ночасно

розкриваються відповідно до

ІОФ,

тобто

виклики

f (x1,...,xm −1,x),x M0 , замінюються на терм g(x1,...,xm −1,x), а виклики

f (x1,...,xm−1,c (y1,...,yn ))

– на терм hc (x1,...,xm−1,y0,...,yn , f (y1),..., f (yn )),

після чого вже у ti +1

розкриваються всі виклики базових функцій

g(x1,...,xm −1,x) і предикатів (в умовних виразах) – вони замінюються на

їхні значення, а умовні підтерми з булевими константами на місці умов

– на альтернативи. Виведення або закінчується термом tn , який не міс- тить входжень f і збігається (за побудовою) з b , або воно є нескінчен-

226

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

ним, що означає невизначеність функції f на аргументі (x1,...,xm−1,a) . Таке правило виведення називається повною підстановкою. Обчислимо

за його

допомогою, наприклад, значення

x ×3 через додавання:

t0 =(x ×3),

t1 = ((x ×2)+ x),

t2 =(((x ×1)+ x)+ x),

t3 = ((((x ×0)+ x)+ x)+ x),

t4 = (((0 + x) + x) + x) = 3x .

 

 

Використовують також інші правила виведення для обчислення значень індуктивної функції. Найвідоміші з них: а) правило найбільш лівої-найбільш внутрішньої заміни – виклик за значенням (замінюється тільки один найбільш лівий найбільш внутрішній виклик функції f );

б) правило найбільш лівої заміни – виклик за іменем (замінюється тіль- ки один найбільш лівий виклик функції f ) тощо. Слід мати на увазі:

якщо конструктор h умовний, то результати застосування наведених вище правил виведення можуть не збігатися (див. вправу 10).

На практиці, щоб скоротити пошук виведення елемента a , нама- гаються максимально спростити будову замкнення M . Для цього на- самперед обмежуються однозначними замиканнями. Індуктивні фун- кції в загальному випадку недетерміновані. Причина в тому, що еле-

мент індуктивної множини M = M (M0,{Fi },P ) може мати кілька сут-

тєво різних виведень з аксіом. Два виведення в M називаються екві- валентними, якщо одне з них може бути отримане з іншого переста-

новкою його членів. Індуктивна множина M = M (M0,{Fi },P ) назива-

ється однозначною, якщо в ній відсутні елементи, що мають нееквіва- лентні виведення з аксіом. Однозначність індуктивної множини гара- нтують такі три умови (але вони не є необхідними):

1) області значень будь-яких двох конструкторів c1 та c2 із {Fi } не перетинаються;

2) для кожного x M існує тільки одна сукупність гіпотез x1,...,xn така, що x = c (x1,...,xn ) для конструктора c ;

3) M0 − найменша та єдина множина твірних у M .

Умова 2) виконується для однозначних конструкторів. Якщо звер- нутися до наведених вище індуктивних означень ІО1 –ІО3 натураль-

них чисел, слів і Б-дерев, то всі вони задовольняють умови 1)–3) і тому

єоднозначними. Наступне ж означення натуральних чисел: (Б) 0 та 1 – натуральні числа,

(І) конструктор s (n ) = n +1

227

ПРОГРАМУВАННЯ

– неоднозначне. Дійсно, кожне число n > 0 за ним має два нееквіва- лентні виведення, що розпочинаються з 0 та 1. Наприклад, для 1 – це

виведення

1

та

 

0,succ (0) , для 2 –

1,succ (1)

та

0,succ (0),succ (succ (0))

 

тощо.

 

 

Приклад 2.38. ІОФ12

спирається на індуктивне означення слів ІО2

і задає функцію ||: Σ* → N , що обчислює довжину слова:

 

(БФ12 )

 

ε

 

= 0 , (ІФ12 ) |

 

pre(a,w)

 

=

 

w

 

+1 ■

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приклад 2.39. Обчислення ваги зваженого Б-дерева.

Нехай БДA – сукупність усіх зважених Б-дерев із вершинами з A . Індуктивна функція Wage : БДА → А задає вагу Б-дерева:

(БФ13 ) Wage( )= 0 ,

(ІФ13 ) Wage(a (d1,d2 ))= a + Wage(d1 )+ Wage(d2 ) ■

За означенням індуктивна функція f здійснює індуктивний пере-

хід тільки за одним, не обов'язково останнім, аргументом, а решта можуть розглядатися як параметри. Аналогічний вигляд мають індук- тивні означення функцій, в яких індуктивний перехід здійснюється одночасно за кількома аргументами, а також систем взаємно індук- тивних функцій. Останні особливо важливі в застосуваннях. Обме- жимося для простоти випадком бінарних функцій. У загальному ви- падку означення будуть аналогічними.

Нехай M = M (M0,{Fi },P ) – довільна індуктивна множина. Домови- мося послідовність вигляду a11,a12,...,a1m ,K, an1,an2,...,anm записувати

скорочено: aij ni,,jm=1 . Вираз aij ni,,jm=0 означає аналогічну послідовність

з індексами, що розпочинаються не з 1, а з 0, але без елемента a00 . Нехай n = n +1,m = m +1.

Загальне індуктивне означення бінарної функції f : M ×M → A має вигляд:

(БФ)

x,y D0 : f (x,y)= g (x,y), де

g (x,y) – відома функція, за-

дана

на множині D0 M ×M , яка

є надмножиною множини

M0 ×M M ×M0 .

 

228

Розділ ІІ. ЕЛЕМЕНТИ ІНФОРМАТИКИ

(ІФ) Для кожної пари конструкторів c : M n → M , d : M m → M із

{F } існує конструктор

h

: M n

×M m

× An

×m

−1 → A

значень функції

i

 

 

c,d

 

 

 

 

 

 

 

 

 

такий,

що

для

будь-яких

x1,...,xn ,y1,...,yn M

та

x0 = c (x1,...,xn ) M ,y0 = d (y1,...,ym ) M :

 

 

 

 

 

 

 

 

 

 

 

,...,xn ,y0,...,ym , f

(xi ,y j )

n,m

 

f (c (x1,...,xn ),d (y1,...,ym ))= hc,d x0

 

.

 

 

 

 

 

 

 

 

 

 

 

i =0, j =0

(ПФС)

Вибирається певний фільтр P (x,y,z ), визначений на універ-

сумі M ×M × A , що здійснює відбір результатів означуваної функції.

Шляхом фільтрації множини M = M (M0,{Fi },P ) можна за необхід- ності типізувати означувану функцію f . Зауважимо, що на практи- ці індуктивна функція може мати інші аргументи, за якими не здій- снюється індукція, конструктори hc,d досить прості й більшість їхніх

аргументів – фіктивні.

Приклад 2.40. ІОФ14 задає ще один варіант визначення множення

натуральних чисел через додавання з індуктивним переходом за обо- ма аргументами:

(БФ14 ) (x ×0)= (0 ×y)= 0 , (ІФ14 ) (s (x )×s (y))= x ×y + x + y +1.

Єдиним конструктором h (x1,x2,x3 ) тут є операція x1 + x2 + x3 +1`■

Увага! Кількість індуктивних переходів при обчисленні добутку x ×y в ІОФ14 збігається з величиною min{x,y} , тоді як ця величина у

випадку ІОФ з індуктивним переходом тільки за y збігається з y . З

урахуванням комутативності множення цю різницю (яка в багатьох випадках досить суттєва) можна нівелювати, помінявши попередньо місцями аргументи. Однак у загальному випадку ІОФ за кількома ар- гументами може виявитись набагато ефективнішим, ніж еквівалент- не визначення за одним аргументом ►

Як і вище, за конструктор hc,d можна брати й саму функцію f . Це

значно розширює можливості ІОФ. Наведемо один із таких прикладів. Приклад 2.41. Функції Аккермана B(x,y).

Вони відомі тим, що надзвичайно швидко зростають. (БФ15 ) B(s (x ),0)= sg (x ), B(0,y) = 2 + y .

(ІФ15 ) B(s (x ),s (y))= B(x,B(s (x ),y)).

229

ПРОГРАМУВАННЯ

В індуктивному переході (ІФ15 ) перший аргумент (x0 = s(x)) фун-

кції B ліворуч входить і в праву частину. Проте важливо, що при цьому другий аргумент у внутрішньому входженні B праворуч спро-

стився: був s (y), а став y . Аналогічно в зовнішньому входженні B

праворуч спростився перший аргумент. Це скеровує обчислення зна- чення функції до бази визначення (БФ15). Можна перевірити, напри-

клад, що B(3,1) = 2 , B(3,2)= 22 , B(3,3)= 222 тощо ■

Індуктивні означення систем функцій (ІОФС) розглянемо на при- кладі бінарних функцій типу M ×M → A . ІОФС системи бінарних фу-

нкцій [f1,K fl ],l > 0 , має структуру:

(БФС) Для x,y D0 : fk (x,y)= gk (x,y), де gk (x,y) – відома функція,

задана

на множині

D0 M ×M ,

яка є

надмножиною множини

M0 ×M M ×M0 , k =1,l .

 

 

 

 

 

 

(ІФС)

Для

кожної

функції fk ,

k =

 

,

і пари

конструкторів

1,l

c : M n →M

та

d : M m →M

2

 

 

існує

конструктор

1

1

 

2

 

 

 

 

 

hc,d,k : M1n ×M2m ×An×m×k → A значень функції такий, що для будь-яких

x1,...,xn M1 , y1,...,ym M2 та x0 = c (x1,...,xn ) M1 , y0 = d (y1,...,ym ) M2 :

fk (c (x1,...,xn ),d (y1,...,ym ))=

=hc,d,k x0,...,xn ,y0,...,ym , f1 (xi ,y j ) ni,,jm=0 ,..., fk (xi ,y j ) ni,,jm=0 .

(ПФС) Вибираються фільтри Pk (x,y,z ), k =1,l , визначені на уні- версумі M1 ×M2 × A , що здійснюють відбір результатів означуваних функцій.

Приклад 2.42. Обчислення кількості комутативних розбиттів нату- рального числа.

Позначимо цю кількість f (n) . Тоді 1+1+1 =1+ 2 = 3 та f (3)= 3 (розбиття 1 + 2 та 2 +1 не розрізняються). Розглянемо допоміжну фун- кцію q : N ×N → N . Функція q (n,m) – це кількість комутативних роз-

230