ПРИКЛАД РОЗРОБКИ

Діяльність у галузі штучного інтелекту налічує багато спроб використання ЕОМ для написання звязного тексту, оповідань і навіть новел До цих пір вони виявлялися неспроможними, проте нижче наводиться коротка програма, яка намагається звязати кілька сотень слів в розповідь Результати виявляються досить цікавими, причому спосіб конструювання пропозицій гарантує їх граматичну правільность1

Основу для оповідань становлять випадковим чином обрані зразки пропозицій, що містять випадковим чином вибрані слова Зразки пропозицій утворені рядками ключових слів, представляють собою назву частин мови При складанні розповіді ці ключові слова заміщуються звичайними словами Наведемо приклад зразка пропозиції:

&quotPERSON VT POSSESSIVE ADJ NOUN&quot

Звичайні слова одного і того ж типу вказуються в одному рядку, що починається з відповідного ключового слова, наприклад:

&quotNOUN: JAGUAR, ROVER 3500, COAT, CAT, TROUSERS&quot

Крім ключових слів у зразках пропозицій можуть бути присутні і будь-які звичайні слова, а також знаки пунктуації, наприклад:

&quotPERHAPS PERSON WILL PREP THE NOUN&quot

1 Так як граматичні правила російської та англійської мов істотно відрізняються, то проста заміна англійських слів, з яких складається розповідь, на їх російські еквіваленти ні до чого доброго не приводить Тому в наведеній нижче програмі переведені тільки коментарі Прим перев

У програмі використовуються наступні частини мови:

Іменники NOUN

. Присвійні займенники POSSESSIVE Особисті займенники PERSON Перехідні дієслова (минулий час) VT Неперехідні дієслова (справжнє час) VI

Прийменники PREP Прикметники ADJ Прислівники  ADV

Загальний образ дій програми такий: вибирається зразок пропозиції та проглядається в пошуках ключових слів NOUN, POSSESSIVE, PERSON і т д Якщо виявлено ключове слово, то береться відповідний список звичайних слів і одне з них витягується випадковим чином для заміщення ключового слова

При розробці передбачається виділити якомога більше самостійних модулів, що представляється ідеальним рішенням для таких систем, які надають можливість написання блокових процедур, наприклад ВВС Насправді, програма, яка послужила прообразом даної розробки, була цілком скомпонована з блочних функцій, але так як вони не дуже широко поширені, то розробка була змінена так, щоб в результаті вийшли підпрограми-блоки

Рівень 1

Ініціювати необхідні змінні і функції

Заповнити відповідні масиви рядків символів зразками пропозицій і списками слів

Вибрати N – число пропозицій, які треба скласти

Утворити і надрукувати N пропозицій

Вся робота виконується в останньому з наведених вище елементів Його можна виконати у вигляді підпрограми

Деталізація 11 Утворити і надрукувати N пропозицій Поки потрібні нові пропозиції,

вибрати випадковий зразок пропозиції,

утворити пропозицію відповідно з обраним зразком,

надрукувати отриману пропозицію Кінець циклу

Рівень 2

Опис рівня 2 утворюється описом рівня 1 і деталізацією 11 Виберемо основний обєкт, що вимагає подальшого розвитку і що знаходиться в деталізації 11, і розгорнемо його у вигляді підпрограми

Деталізація21 Утворити пропозицію відповідно з обраним зразком

Поки ще залишилися списки слів (правила), переглянути пропозицію і замінити в ньому

кожне входження ключового слова на одне зі звичайних слів списку Кінець циклу

Рівень 3

Опис рівня 3 утворюється з опису рівня 2 і деталізації 21 Воно досить ясно, і тільки операція переглянути пропозицію ..” вимагає розшифровки Розгорнемо цю операцію в підпрограму

Деталізація 31 Переглянути пропозицію і замінити в ньому кожне входження ключового слова на одне зі звичайних слів списку Витягти тип слова з початку списку слів (правила) Знайти число

входжень цього ключового слова (типу слова)

в пропозицію

Поки ще залишилися входження,

витягти випадковим чином звичайне слово зі списку, замінити входження на це слово Кінець циклу

Рівень 4

Більшість з наведених вище операцій досить деталізовано, і для завершення опису рівня 4 треба уточнити хіба лише операцію витягти випадковим чином слово зі списку.

Деталізація 41 Витягти випадковим чином слово зі списку Знайти число звичайних слів у списку

(Правилі) Отримати випадкове число Витягти з цього числа відповідне слово

Рівень 5

Таким чином, ми досягли рівня 5 На цьому етапі більшість з описаних дій знаходиться досить близько до остаточних програмним операторам Це забезпечує безпосередній переклад в оператори Бейсика після однієї додаткової ітерації, на якій треба прийняти певні конкретні рішення про необхідні строкових функціях, про імена і про використання важливих змінних

Перед виконанням цієї роботи треба включити в опис одну дуже корисну модифікацію Повернемося до деталізації 11 в ній після утворення пропозиції дається інструкція надрукувати отримане пропозицію , яка повинна перетворитися на простий оператор PRINT Проте в результаті настільки нехитрою друку слова в кінці рядків екрану ВТУ можуть обриватися посередині і закінчуватися на наступних рядках У принципі це може виявитися прийнятним, але для додання висновку гарного вигляду замість цього оператора треба використовувати підпрограму Деталізація 12 Надрукувати отриману пропозицію

Використовуючи строкову змінну як буфер, додати пропозицію до поточного вмісту буфера

Якщо число символів в буфері менше довжини рядка ВТУ, то вийти з підпрограми,

в іншому випадку надрукувати частину рядка аж до кінця відповідного слова і видалити надруковані символи з буфера

Тепер уже в рівень 2 увійдуть дві деталізації: 11 та 12 Цей новий варіант все ще вимагає певного доопрацювання

Деталізація 22 Надрукувати отриману пропозицію

Додати пропозицію до поточного вмісту буфера

Якщо число символів в буфері < довжина рядка, то вийти з підпрограми,

в іншому випадку покласти довжина = Довжина рядка

Поки в позиції довжина знаходиться символ, який не є пропуском, зменшувати довжина на 1

Кінець циклу

Надрукувати символи з буфера в кількості довжина.

Видалити з буфера надруковані символи, а також прогалини, що опинилися після цього ведучими Перед тим як приступити до опису рівня 6, повернемося до рівня 1 і переробимо його в оператори основної програми При цьому для більшості систем буде потрібно генератор випадкових чисел в діапазоні 1 .. N

Рівень 6

Визначити функцію, що генерує випадкові числа в діапазоні 1 .. N

Визначити необхідні масиви рядків символів Занести зразки пропозицій в масив S $ () Занести списки слів (правила) в масив R $ ()

Отримати випадкове число N в діапазоні 15 .. 25 для використання в

якості числа пропозицій в абзаці Викликати деталізацію (11) для отримання N пропозицій

Закінчити виконання

(Підпрограма, що відповідає деталізації (11)) Занести в буфер В $ () порожній рядок Для J від 1 до N

вибрати в якості зразка пропозиції

S $ (випадкове число) і занести його в Т $,

викликати деталізацію (21) для перетворення Т $ в даний пропозицію,

викликати деталізацію (22) для виведення пропозиції Т $ в хорошому вигляді Наступний прохід циклу

Повернення

(Підпрограма, що відповідає деталізації (22)) Для I від 1 до R (до числа правил) покласти В1 $

рівним правилом S $ (I),

викликати деталізацію (31) для заміни кожного ключового слова звичайним словом

Наступний прохід циклу Повернення (Підпрограма, що відповідає деталізації (31)) Шукати положення (:) в В1 $

Переписати в WS ключове слово правила, що знаходиться зліва від (:) Переписати в S $ список звичайних слів, що знаходиться справа від (:) Знайти число Про входжень ключового слова W $ в пропозицію Т $

Для I1 від 1 до 0 викликати деталізацію (41), що повертає випадкове слово в В1 $

Наступний прохід циклу Повернення (Підпрограма, що відповідає деталізації (41)) Занести в О число слів у списку S $,

підрахувати число запитах в цьому списку Отримати випадкове число в діапазоні 1 .. О Знайти по комам відповідне слово у списку S $

Занести це слово в В1 $ Повернення

(Підпрограма, що відповідає деталізації (22)) Додати пропозицію T $ в буфер В $ Занести в L число символів в В $ Якщо L < = Довжина рядка (40), то повернення, в іншому випадку покласти L = 40. Поки L-й символ рядка В $ відрізняється від пробілу,

L = L-1 Кінець циклу

Надрукувати L перших символів рядка В $ Поки L-й символ рядка В $ є прогалиною, L = L +1 Кінець циклу

Зрушити вміст буфера В $ вліво, видаливши L перших символів Повернення Кінець програми

Одна з причин, по якій доводиться виконувати так багато операцій з рядками символів, полягає в тому, що елементи зразків пропозицій і правил мають змінну довжину, внаслідок чого при витяганні та заміщення елементів доводиться підраховувати зайняті і прогалини і визначати позиції Можна було б спростити програму, якби кожен з цих елементів зберігався в окремому елементі масиву рядків символів, наприклад, за рахунок застосування двовимірних масивів S $ (I, J) і RS (I, J) Однак при такому підході стає важче змінювати зразки пропозицій і списки слів, і одним з достоїнств розробленої вище програми є простота експериментування з різними списками слів і зразками пропозицій

Зверніть увагу на те, що підпрограма, відповідна деталізації (22), може бути використана і в багатьох інших додатках як процедура виведення тексту за словами Насправді і вся ця програма може бути використана для інших програм, так як вона просто розміщує обєкти по зразкам Такими обєктами, наприклад, можуть бути графічні елементи в списках замість слів можна вказувати команди управління переміщенням курсора, що забезпечують викреслювання-яких фігур Створені пропозиції послужать зразками для зображення малюнків на всьому екрані або на його частини – Машина стане художником Аналогічно, якщо є звуковий генератор, можна розробити систему для отримання машинної музики Використовуючи рядкові функції Бейсика Microsoft, рівень 6 можна перевести в наступну закінчену програму:

10 REM СОЧИНЕНИЕ КОМПЮТЕРА

20 REM ФУНКЦІЯ FNA ГЕНЕРУЄ ВИПАДКОВЕ ЧИСЛО

22 REM У діапазоні від 1 до N

30 DEF FNA(N) = INT(N*RND+1)

40 REM

58 DIM S $ (5), R $ (10), Р1 (20)

60 S=5

70 S$(1)=&quotPERSON VT POSSESSIVE ADJ NOUN&quot

80 S$(2)=&quotPERHAPS PERSON WILL VI PREP THE NOUN&quot

90 S$(3)=&quotADV PERSON VT THE NOUN&quot

100 S$(4)=&quotPREP THE ADJ NOUN PERSON VT&quot

110 S$(5)=&quotVI THAT, PERSON WILL ADV VI THE ADJ NOUN&quot

120 REM

130 R=8

140 R$(1)=&quotNOUN:BLACK HOLE,STARSHIP,PLANET,MOON,SUN&quot

150 R$(2)=&quotPOSSESSIVE:HIS,HER,THEIR&quot

160 R$(3)=&quotPERSON: THE GALACTIC LORD,THE DARK ONE,HE,SHE&quot

170 R$(4)=&quotVT:HIT,TURNED,WENTFLEW,STOPPED,LEFT&quot

180 R$(5)=&quotVI:LOOK,STOP,LEAVE,NOTICE,RUN,DESTROY&quot

190 R$(6)=&quotPREP:UNDER,THROUGH,ROUND,ON,NEAR,CLOSE TO&quot

200 S (7)=&quotADJ:BRIGHT,PULSING,LONELY,FEEBLE&quot

210 R$(8)=&quotADV:SLOWLY,QUIETLY,SWIFTLY,SUDDENLY&quot

220 REM

230   N=15+FNA(10)

240   GOSUB 270

250  STOP

260   REM

270 REM ПІДПРОГРАМА ВИВЕДЕННЯ N ПРОПОЗИЦІЙ

280   PRINT

290   B$=&quot&quot

300   FOR J=l TO N

310   T$=S$(FNA(S))

320   GOSUB 390

330   GOSUB 720 340   NEXT J

350   PRINT B$

360   PRINT

370   RETURN

380   REM

390 REM ПІДПРОГРАМА підстановками СЛІВ В Т $ ЗА ПРАВИЛАМИ

395 REM В R $)

400 REM ВХІД: Т $ В ЯКОСТІ ЗРАЗКА ПРОПОЗИЦІЇ

405 REM ВИХІД: результати підстановки В Т $

410 FOR I = 1 ТО R

420   B1$=R$(I)

430   GOSUB 470

440 NEXT I

450 RETURN

460 REM

470 REM ПІДПРОГРАМА ЧАСТКОВУ підстановками СЛІВ В Т $

475 REM ЗГІДНО розпорядження, які у В1 $

480 REM ВХІД: T $, B1 $

485 REM ВИХІД: T $ С ЧАСТКОВО підставлену СЛОВАМИ

490 C=INSTR(B1$,&quot:&quot)

500 W$=LEFT$(B1$,C-1)

510 S$=RIGHT$(Bl$ ,LEN(B1$)-C)

520 REM W $ МІСТИТЬ КЛЮЧ (НАЗВА ЧАСТИНИ МОВИ),

525 REM A S $ СПИСОК СЛІВ

530 Y$=T$

540 XS=W$

550 GOSUB 900

560 FOR 11=1 TO 0

570   GOSUB 630

580   P=INSTR(T$,W$)

590   T$=LEFT$(T$,P-1)+B1

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*