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

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

.pdf
Скачиваний:
52
Добавлен:
07.03.2016
Размер:
4.72 Mб
Скачать

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

(ПС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,...,xm1,c (y1,...,yn ))

на терм hc (x1,...,xm1,y0,...,yn , f (y1),..., f (yn )),

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

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

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

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

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

226

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

ним, що означає невизначеність функції f на аргументі (x1,...,xm1,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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]