М е т а: Навчитись описувати та використовувати для розв’язування задач списки, елементами яких є структури.
З а в д а н н я:
1. Виконати запропоновані Вам програми для задачі про розташування восьми ферзів на шаховій дошці та для задачі про додавання двох многочленів. Проаналізуйте рекурсивні правила, які використовуються в цих програмах.
2. Нехай поля шахової дошки подані парами координат у вигляді p(X,Y), де X, Y набувають значень від 1 до 8.
а) Визначити відношення step_hourse(P1,P2), яке відповідає ходу коня на шаховій дошці з поля P1 в поле P2. Вважайте, що поле P1 завжди задано, а поле P2 може бути не конкретизованим. Наприклад,
?– step_hourse(p(1,1),P).
P=p(3,2);
P=p(2,3)
no
б) Описати відношення path_horse(Path,N), де Path — список перших N полів, на які послідовно може ходити кінь згідно правил гри по порожній дошці. Перше поле в шляхові Path задано. Використовуючи відношення path_horse, написати запит для знаходження довільного шляху, який складається із чотирьох ходів і розпочинається з поля p(2,1), а закінчується на протилежній стороні дошки (Y=8). Цей шлях після другого ходу повинен ще проходити через поле P(5,4).
В к а з і в к и до виконання завдань: У завданні 1 для задачі про додавання многочленів попробуйте різні варіанти запитів, які відповідають різним співвідношенням між степенями многочленів.
Під час апробації процедури для предикати path_horse обмежте довжину шляху коня невеликою початковою кількістю ходів, інакше отримаєте повідомлення про переповнення рекурсивного стеку.
К о н т р о л ь н і п и т а н н я:
1. Навести приклади опису списків структур в мові Turbo-Prolog.
2. Для чого в рекурсивних процедурах потрібно описувати граничні умови?
Лабораторна робота № 7 (4 год)
Т е м а: Керування механізмом перебору в Prolog–системах за допомогою відсіку.
М е т а: Оволодіти прийомами використання відсіку в Пролог–програмах.
З а в д а н н я:
1. Наступне відношення розподіляє числа на три класи — додатні, нуль та від’ємні:
class(Number, positive):–Number>0.
class(Number, zero):–Number=0.
class(Number, negative):–Number<0.
Зробити цю процедуру більш ефективною за допомогою відсіку.
2. Описати процедуру devide(Numbers,Positive,Negative), яка розбиває список чисел на два списки: Список, який містить невід’ємні числа, та список від’ємних чисел. Наприклад,
devide([3,-1,0,5,-2],[3,0,5],[-1,-2])
Складіть два варіанти цієї процедури: один з використанням відсіку, другий — без нього.
3. Описати відношення, за допомогою якого можна здійснювати віднімання множин:
difference(Set1, Set2, Diff)
де всі три множини подаються у вигляді списків. Нариклад,
difference([a,b,c,d], [b,d,e,f], [a,c])
4. Написати процедуру un(L1,L2,L) злиття двох впорядкованих списків L1 і L2 у третій список L. Наприклад,
?- un([2,5,6,6,8],[1,3,5,9],L)
L=[1,2,3,5,5,6,6,8,9]
К о н т р о л ь н і п и т а н н я:
1. Як можна обмежити ті розгалуження в рекурсивних алгоритмах, на яких завідомо не можна отримати відповіді розв’язуваної задачі?
2. В якій мірі відсік є аналогом розгалуження в мовах процедурного типу?
3. Як в мові Пролог вводиться в розгляд поняття заперечення?
Лабораторна робота № 8 (2 год)