Факт - це твердження про те, що дотримується деяке конкретне відношення. Це твердження завжди істинно
Факт - фраза без умов. Факт використовується для того, щоб показати простий взаємозв’зок даних. Факт складається з імені предиката й списку аргументів (термів), ув'язнених у дужки.
Тільки програміст вирішує як назвати предикат. Бажано, щоб ім’я було максимально наближене до природної мови. Вибирається ім’я, що найкраще відбиває певний вид взаємозв’язку між аргументами. Наприклад, фразу "жаба є переможцем у стрибках у висоту" можна на Пролозі виразити наступним фактом:
winner(high_Jumping,frog).
Тут у прикладі термами є атоми. Ім’я предиката -winner.
Перший символ імені предиката обов’язково повинен бути малою літерою латинського алфавіту, наступні - буквами латинського алфавіту, цифрами або символом ‘_’. Будь-які інші символи неприпустимі.
Атом - константа, синтаксис якої аналогічний синтаксису імені предиката.
Кількість аргументів у предиката не обмежено.
Запуск Пролог-Програми здійснюється запитами. Один факт уже є пролог-програма, і до нього можна звертатися із запитами.
Запит - це ціль, що переслідується користувачем-програмістом, по з’ясуванню нової або підтвердженню/запереченню істинності зазначеної інформації, що задається в командному рядку інтерпретатора. Кожний запит обов’язково закінчується крапкою.
Запит може бути успішним, якщо в програмі є відповідна інформація, або неуспішним - у протилежному випадку. Простий запит складається з імені предиката, за яким розташовується список аргументів.
Приклади запиту до наявному в нас факту можна записати такими способами:
?- winner(high_Jumping,frog).
yes
Трактування запиту: “чи Є жаба переможцем у стрибках у висоту?”. Відповідь ‘yes’ говорить про те, що запит успішний. Отже, “Так, є”.
?- winner(high_Jumping,X).
X = frog ->
yes
X - змінна - вид терма, що записується як слово, що починається із прописної латинської букви. Якщо в запит входять змінні, то інтерпретатор намагається відшукати такі їхні значення, при яких запит буде істиною.
Після символів -> натискаємо <enter>, що означає відмову від пошуку інших конкретизацій змінної X. Трактування запиту: “Хто є переможцем у стрибках у висоту?”. Відповідь полягає в одержанні конкретизації змінної X – “переможцем у стрибках у висоту є жаба”.
Виконання запиту: інтерпретатор намагається уніфікувати (зв'язати) аргументи запиту з аргументами фактів, що входять у БД. Змінна конкретизується, коли при виконанні запиту вона уніфікується з деяким значенням.
Розглянуті запити були простими. У командному рядку інтерпретатора можна задати складений запит:
?- Y=high_Jumping, winner(Y,frog).
Y = high_Jumping ->
yes
Запит: “Вид змагань - стрибки у висоту” і “Чи Є жаба переможцем у цьому виді змагань?”. Відповідь: “Так, є”.
У синтаксисі Прологу символ “,” означає логічне “і”, символ “;” - логічне “або”.
Елементарна пролог-програма може мати вигляд:
% Програма 1.1: переможець (назва змагання, ім'я).
winner (high_Jumping, frog).
winner (long_Jumping, kengaroo).
Символ % означає, що наступний за ним запис до кінця рядка є коментар. Цей символ може стояти як на початку рядка, так і після деякого предиката. Коментарем також уважається інформація, укладена в символи /* і */. Місце розташування такого коментарю не регламентується.
Прості запити до програми 1.1.
?- winner(X,kengaroo).
X = long_Jumping ->
yes
Запит: “Переможцем у якому виді змагань є кенгуру?” Відповідь: “У стрибках у довжину”.
?- winner(Y,_).
Y = high_Jumping ->;
Y = long_Jumping ->;
no
Символ підкреслення “_” виступає в якості анонімної змінної, котра пропонує інтерпретаторові проігнорувати значення аргументу. Анонімна змінна уніфікується із чим завгодно. Уведення; ("або") після символів -> означає наказ інтерпретаторові передовести запит для одержання нової конкретизації змінної.
Запит: “У яких видах змагань виявлялися переможці?” Відповідь: “У стрибках у висоту”.
Альтернативна відповідь: “У стрибках у довжину”.
Запит неуспішний: “Ніяких інших варіантів ні”.
Інший запит:
?- winner(Z,cat).
no
Запит: “Переможцем у якому виді змагань є кішка?” Запит неуспішний: “Кішка не є переможцем у жодному виді змагань”.