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