У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


підчеркування позначає анонімну змінну. В Пролозі змінна може зв'язуватись з любим допустимим аргументом або об'єктом даних. Відмітимо, що змінні Прологу є локальними, а не глобальними. Іншими словами, якщо два пункти мають змінну Х, тоді ці Х є різними змінними.

5.1.1. Константи як об'єкти даних.

Константи включають символи, числа і атоми. Значення константи міститься в її імені. Так константа 2 може символізувати тільки число 2, а константа abracadabra може символізувати тільки стрічку abracadabra.

Символи.

Символи мають тип char, вони будуються з символів коду ASCII.

Існує два способи задання символів в якості констант Прологу: безпосередньо, або ж з попереднім символом (\). Ось приклад деяких друкованих символів: 'f', '4','F'. Якщо ж вам потрібно написати символи типу (\), ("), ('), тоді перед ними потрібно поставити символ (\): ('\\'), ('\"'), ('\''). Деякі пари символів позначають спеціальні дії, наприклад:

'\n'-перехід на нову стрічку;

'\r'-повернення каретки;

'\t'-горизонтальна табуляція.

Числа.

Числа мають тип або іnteger, або real. Цілі містять значення з діапазону від -32768 до 32767 включно. Дійсні зберігаються в форматі ІEEE в проміжку від 1е-308 до 1е308.

Атоми.

Атом має тип або ж symbol, або ж string. Пролог виконує автоматичне перетворення типів між цими двома доменами.

Ім'я символьних атомів починається з маленької букви.

Стрічкові атоми повинні заключатись в подвійні лапки і можуть містити любу комбінацію дозволених символів PDC Прологу.

5.2.Складні об'єкти даних і функтори.

Складні об'єкти даних дозволяють вам заключати декілька частин інформації в єдиний пункт. Наприклад, дата 2 квітня 1994 складається з 3 частин. Але іноді їх корисно з'єднати воєдино:

date("April",2,1989)

Так виглядає факт Прологу, в даному випадку - просто об'єкт даних. Він починається з імені або ж функтора (в нашому прикладі date). Функтор не символізує якесь обчисленя, яке повинно бути виконаним. Це просто ім'я об'єкту. Аргументи складного об'єкту самі можуть бути складними об'єктами.

BIRTHDAY

/ \

/ \

person date

/ \ / ! \

''Joe'' ''Jones'' ''Aug''20 1918

або ж

birthday(person(''Joe'',''Jones''),date(''Aug'',20,1918))

5.2.1.Уніфікація складних об`єктів.

Складний об`єкт може уніфікуватись або ж з простою змінною, наприклад,

data(''April'',2,1981) зрівнюється з X і зв'язує X з date(“April”,2,1981),

або ж з складним об'єктом, який співпадає з ним структурно:

так data(''April'',2,1981) зрівнюється з date(Mo,Da,Yr).

Використання знаку дорівнює для уніфікації складних об'єктів.

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

domains

person = person(name,address)

name = name(first,last)

address = addr(street,city,state)

street = street(number,street_name)

city,state,street_name = string

first,last = string

number = integer

goal

P1 = person(name(jim,mos),

addr(street(5,"1stst"),igo,"CA")),

P1 = person(name(_,mos),Address),

P2 = person(name(jane,mos),Address), write(P2).

Складні об'єкти можуть бути переглянуті і перетворені в прості об'єкти фраз вашої прологівської програми, що значно спрощує програмування. Наприклад , розглянемо факт:

owns(john,book('From Here to Eternity','James Jones')),

в якому ми стверджуємо, що Джон має книгу 'З теперішнього в майбутнє', яку написав Джеймс Джонс. Подібно ви можете написати:

owns(john,horse(blackly)),

який можна було б інтерпретувати так:

Джон має коня, якого кличуть blacky.

Складними об'єктами в цих прикладах будуть:

book('From Here to Eternity','James Jones') і

horse(blacky).

Якщо написати два факти:

owns(john,'From Here to Eternity').

owns(john,blacky).

тоді ви при традиційному запиті не зможете відрізнити :

blacky буде назвою книги чи кличкою коня. З іншого боку ми можемо використати в якості першої компоненти складного об'єкту функтор, для розмежування різних об'єктів. Для цього прикладу бажано було б використати функтори книги і коня.

5.2.2.Приклад застосування функторів.

Не тільки аргументи, а також функтор може нести корисну інформацію, якщо ви визначаєте домейн з декількома альтернативними функторами. Розглянемо типічну задачу зсуву курсора на екрані терміналу. Ви можете заключити, що предикат повинен мати два аргументи: напрямок зсуву і відстань зсуву. В Пролозі ці аргументи можуть бути простими об'єктами. Програма, зображена на малюнку 5.1, демонструє як це можна зробити. Вона використовує предикат cursor(Row,Column), який робить дві речі:

1)інформує де знаходиться курсор, коли аргументи його вільні;

2)розміщує курсор у відповідну стрічку і стовбець екрану згідно значень аргументів.

domains

row, column, step = integer

movement = up(step);

down(step);

left(step);

right(step)

predicates

move_cursor(row, column, movement)

clauses

move_cursor(R, C, up(Step)) :- cursor(R, C),

R1=R-Step, cursor(R1, C).

move_cursor(R, C, down(Step)) :- cursor(R, C), R1=R+Step,

cursor(R1, C).

move_cursor(R, C, left(Step)) :- cursor(R, C), C1=C-Step,

cursor(R, C1).

move_cursor(R, C, right(Step)) :- cursor(R, C), C1=C+Step,

cursor(R, C1).

мал.5.1.

5.3.Приклад використання складних об'зктів.

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

predicates

birthday

 

Month Day Year

clauses

phone( concretic values).

phone( concretic values).

Перші 5 аргументів предикату можуть бути представлені у вигляді двох складних об'єктів типу:

person

/ \

First name Last name

Які ми можемо реалізувати у вигляді відношeнь:

person(First_name,Last_name)

birthday(Month,Day,Year)

Тоді ми можемо написати програму, яка дуже легко читається.

domains

name= person(sym,sym)

birthday=b_data(sym,integer,integer)

ph_numb = sym

predicates

phone_list(name,ph_numb,birth_day)

clauses

phone_list(person(ed,willas),''422-324'',b_data(...)).

phone .....

Вона також зручна для модификації. Наприклад, додавши до нашої програми кілька правил, ми можемо створювати список людей, день народження яких належить поточному місяцю (стандартний предикат data бере з комп'ютерного годинника поточну дату).

domains

name


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22