Предмет:
Тип роботи:
Методичні вказівки
К-сть сторінок:
44
Мова:
Українська
які заздалегідь відомо, істинні вони або помилкові. Для цих цілей використовують предикати true й fail. Предикат true завжди істинний, у той час як fail завжди помилковий.
Вбудований предикат read дозволяє зчитувати терми із клавіатури. При цьому запрошення Прологу ?- міняється на |:. Терм, що вводиться, повинен обов'язково закінчуватися крапкою.
Приклад
?- read(Name), read(Age).
|: микола. 15.
Name = микола
Age = 15
Yes
?- read(X), більше_2(X,Y).
|: віслюк.
X = віслюк
Y = собака ;
X = віслюк
Y = мавпа ; No
Якщо при обробці запитів Прологу ви побажаєте одержати більш докладний висновок, то для цих цілей можна використати предикат write. Аргументом цього предиката може бути будь-який припустимий терм Прологу. У випадку, коли аргументом є змінна, буде надруковане її значення.
Виконання предиката nl здійснює переніс рядка: наступний висновок почнеться з нового рядка. Предикат tab виводить кількість пробілів, визначену його аргументом.
Приклад
?- write('Hello World!'). Hello World!
Yes
- write('Hello'), nl, tab(5), write('World!'). Hello
World!
Yes
?- X = слон, write(X), nl. слон
X = слон
Yes
В останньому прикладі спочатку змінна X уніфікується з атомом слон, а потім значення змінної X, тобто слон, виводиться на екран за допомогою предиката write. Після переходу на новий рядок Пролог видає звіт про уніфіковану змінну, тобто друкує X = слон.
Більшість Пролог-систем надає доступ до довідкової інформації при виклику предиката help. Застосований до терму (звичайно представляє ім'я вбудованого предиката) він виводить короткий опис цього терму.
Приклад
?- help(write). write(+Term)
Write Term to the current output, using brackets and operators
where appropriate. See feature/2 for contrillongfloating point
output format.
write(+Stream, +Term) Write Term to Stream.
Yes
І, наостанок, поговоримо про коментарі. Коментарі ніяк не впливають на виконання програми, але при їх правильному використанні вони являються досить істотною частиною вихідного тексту. Трохи вдало розташованих рядків з коментарями дуже допоможуть людині, яка читає програму. Пролог ігнорує довільне число рядків, укладене між символами /* й */. Усе, що перебуває між
% і кінцем рядка, теж розглядається як коментар:
Приклад
/* Це
коментар */
% Це теж коментар
1.9. Рішення логічних задач
Інтерпретатор Прологу можна змусити вирішувати логічні задачі, що недоступно більшості процедурних мов.
Багато логічних задач пов'язані з розглядом декількох кінцевих множин з однаковою кількістю елементів, між якими встановлюється взаємо-однозначна відповідність. Мовою Пролог ці множини можна описувати як бази даних, а залежності між об'єктами встановлювати за допомогою правил.
Приклад
В автомобільних перегонах три перших місця зайняли Олексій, Петро й Микола. Яке місце зайняв кожний з них, якщо Петро зайняв не друге й не третє місце, а Микола - не третє?
І'мяI містоII містоIII місто
Олексій
Петро--
Микола-
Традиційним способом задача вирішується заповненням таблиці. За умовою задачі Петро зайняв не друге й не третє місце, а Микола - не третє. Це дозволяє поставити символ '-' у відповідних клітках. Між множиною імен учасників перегонів й множиною місць повинне бути встановлене взаємо- однозначна відповідність. Тому визначаємо зайняте місце спочатку в Петра, потім у Миколи й, нарешті, в Олексія. У відповідних клітках проставляємо знак
'+'. У кожному рядку й кожному стовпці повинен бути тільки один такий знак.
І'мяI містоII містоIII місто
Олексій--+
Петро+--
Микола-+-
З останньої таблиці випливає, що Олексій посів третє місце, Петро - перше, Микола - друге.
Мовою Пролог структура програми буде наступною: спочатку перераховуються дані - імена й номер зайнятого місця, а потім записуються правила, що зв'язують ці дві множини.
/* База даних імен */ ім'я(олексій). ім'я(петро). ім'я(микола).
/* База даних призових місць*/
місце(перше). місце(друге). місце(третє).
/* Встановлюємо взаємо-однозначну відповідність між базами даних, X - елемент із бази даних імен,
Y - елемент із бази даних зайнятих місць */
/* Петро зайняв не друге й не третє місце */
відповідність(X, Y) :- ім'я(X),X=петро, місце(Y), not(Y=друге), not(Y=третє).
/* Микола посів не третє місце */
відповідність(X, Y) :- ім'я(X), X=микола, місце(Y), not(Y=третє).
відповідність(X, Y) :- ім'я(X),X=олексій, місце(Y).
/* У всіх хлопців різні місця */
рішення(X1,Y1,X2,Y2,X3,Y3) :-
X1=петро, відповідність(X1,Y1), X2=микола, відповідність(X2,Y2), X3=олексій, відповідність(X3,Y3), Y1\=Y2, Y2\=Y3, Y1\=Y3.
Для одержання відповіді варто виконати запит
?- рішення(X1,Y1,X2,Y2,X3,Y3).
У відповідь Пролог видасть імена хлопців і зайняті ними місця. Перевірте, чи є інші варіанти відповідей.
Приклад
Вітя, Юра та Михайло сиділи на лавці. У якому порядку вони сиділи, якщо відомо, що Михайло сидів ліворуч від Юри, а Вітя ліворуч від Михайла.
В умові задачі перераховуються об'єкти одного типу, зв'язані між собою. Заповнимо базу даних:
/* Михайло сидів ліворуч від Юри*/
ліворуч(юра,михайло).
/* Вітя сидів ліворуч від Михайла */
ліворуч(михайло,вітя).
равило для встановлення проходження