Предмет:
Тип роботи:
Методичні вказівки
К-сть сторінок:
44
Мова:
Українська
justify;">Приклад
Напишіть предикат, що по двох парах чисел - довжинам катетів прямокутних трикутників - визначає величину меншої з гіпотенуз.
Скористаймося процедурою гіпотенуза, яка розібрана вище, та вбудованою функцією min:
мін_гіп(A1,B1,A2,B2,Min):- гіпотенуза(A1,B1,C1), гіпотенуза(A2,B2,C2), Min is min(C1,C2).
Запити до інтерпретатора Прологу можуть виглядати так:
?- мін_гіп(3,4,8,6,X). X = 5
Yes
?- мін_гіп(3,4,Y,6,X).
No
Приклад
Факторіалом натурального числа n є добуток всіх цілих чисел від 1 до n включно. Для запису факторіала числа n використають позначення n!.
n!=n*(n-1)*(n-2)*...*2*1=n*(n-1)!
Наступна процедура обчислює факторіал числа. Зверніть увагу на використання рекурсії в даній процедурі:
факторіал(1,1).
факторіал(N,R):- integer(N), N>1, N1 is N-1, факторіал(N1,R1), R is N*R1.
Перше правило (так званий термінальний випадок, тобто той момент виконання процедури, коли вона перестає викликати сама себе) говорить, що факторіал одиниці дорівнює одиниці. Друге правило є просто запис визначення факторіала: результат R виходить множенням числа N на факторіал числа, яке на одиницю менше. Воно буде спрацьовувати при всіх n>1 тому, що інтерпретатор Прологу переглядає базу даних зверху вниз і переходить до
наступного правила або факту тільки в тому випадку, коли він не може виконати поточне правило.
Прклад
Напишіть програму мовою Пролог, що друкує суму всіх цифр введеного з клавіатури числа.
Для рішення даної задачі скористаємося двома предикатами. Предикат сума має своїм першим аргументом число, сума цифр якого є його другим аргументом. Другий предикат - друк_суми - запитує число, викликає предикат сума та друкує отриманий результат.
сума(X,Y):- integer(X), X<10, Y is X.
сума(X,Y):- integer(X), X1 is X//10, сума(X1,Y1), Z is X mod 10, Y is Y1+Z.
друк_суми:-write('Введіть число (наприкінці крапка): '), read(X), nl, сума(X,Y),
write('Сума цифрчисла '), write(X),
write(' дорівнює '), write(Y), nl.
Правило друк_суми не має аргументів, дані вводяться з клавіатури й потім, за допомогою механізму уніфікації, передаються іншим підцілям даного правила.
Приклад
Напишіть програму мовою Пролог, що вводить з клавіатури два числа - координати точки на площині та визначає, чи попадає дана точка в коло одиничного радіуса із центром на початку координат.
inside(X,Y,попадає):- number(X), number(Y), X**2+Y**2=<1.
inside(X,Y,не_попадає):-number(X), number(Y), X**2+Y**2>1.
/* Ввести два числа та викликати предикат inside */
input:-write('Введіть x-координату: '), read(X), nl,
write('Введіть y-координату: '),
read(Y), nl, inside(X,Y,R), write(R).
1.12. Списки
Списки - одна з найчастіше вживаних структур у Пролозі. При записі список беруть у квадратні дужки, а елементи списку розділяють комами, наприклад,
[слон, кінь, мавпа, собака]
Ц список із чотирьох атомів - слон, кінь, мавпа, собака.
Елементами списку можуть бути будь-які терми Прологу, тобто атоми, числа, змінні й складні терми, що дозволяє, зокрема, складати списки зі списків. Порожній список записується як [ ].
[слон, [ ], X, предок(Х, том), [a,b,c], f(22)]
Перший елемент непорожнього списку називається головою, а інша частина списку зветься хвіст. У списку, що складається тільки з одного елемента, головою є цей єдиний елемент, а хвостом - порожній список. Позначення [H|T] використовується для визначення списку з головою H і хвостом T. Якщо символ | розміщений перед останнім термом списку, то це означає, що цей останній терм визначає інший список. Повний список вийде, якщо з'єднати цей підсписок з послідовністю елементів, розташованих до цієї риси.
В наступному прикладі 1 - голова списку, а [2, 3, 4, 5] - хвіст. Пролог покаже це за допомогою співставлення списку чисел зі зразком, що складається з голови й хвоста.
?- [1, 2, 3, 4, 5] = [Head | Tail]. Head = 1
Tail = [2, 3, 4, 5] Yes
Тут Head і Tail - тільки імена змінних. Ми так само могли б використати X і Y або які-небудь інші імена змінних. Помітимо, що хвіст списку завжди є списком. Голова, у свою чергу, є елемент списку, що вірно й для всіх інших елементів, розташованих до вертикальної риси. Це дозволяє одержати, скажімо, другий елемент списку.
Приклад
Використаємо анонімні змінні для голови й списку, що стоїть після риси, якщо нам потрібний тільки другий елемент списку:
?- [слон, кінь, осел, собака] = [_, X | _ ]. X = кінь
Yes
Розглянемо кілька процедур обробки списків. Зверніть увагу, що всі вони використовують рекурсію, у якій термінальне (базове) правило визначене для порожнього списку.
Приклад
Напишемо предикат для обчислення суми всіх елементів списку чисел.
сума_списку([],0).
сума_списку([H|T],S):- number(H), сума_списку(T,S1),
S is S1+H.
Приклад
Предикат місце успішний, якщо третій аргумент є список, який отриманий вставкою першого аргументу в довільне місце списку, що є другим аргументом.
місце(E, L, [E|L]).
місце(E, [H|L], [H|Y]):-місце(E, L,Y).
Подивимося на результати деяких запитів, що використовують цей предикат.
?- місце(1,[2,3],X). X = [1, 2, 3] ;
X = [2, 1, 3] ;
X = [2, 3, 1] ; No
?- місце(1,L,[2,1,3]). L = [2, 3] ;
No
?-