pan>
2) Х належить хвосту L.
Це можна записати у вигляді двох пропозицій, перше з яких є простий факт, а друге правило:
належить (Х, [Х | Хвіст]).
належить (Х, [Голова | Хвіст]): -
належить (Х, Хвіст).
Зчеплення (конкатенація)
Для зчеплення списків ми визначимо ставлення
конк (L1, L2, L3)
Тут L1 і L2 два списки, а L3 - список, одержуваний при їх зчепленні. Наприклад,
конк ([a, b], [c, d], [a, b, c, d])
істинно, а
конк ([a, b], [c, d], [a, b, а. c, d])
брехливо.
Визначення відносини конк, як і раніше, містить два випадки в залежності від виду першого аргументу L1:
1) Якщо перший порожній, тоді другий і третій аргумент являють собою один і той же список (назвемо його L), що виражається у вигляді наступного прологовского факту: span>
конк ([], L, L)
2) Якщо перший аргумент відносини конк не порожній, то він має голову і хвіст і виглядає так
[X | L1]
Хоча програма для конк виглядає досить просто, вона має велику гнучкість і її можна використовувати багатьма іншими способами. Наприклад, її можна застосувати як би в зворотному напрямку для розбиття заданого списку на дві частини:
? - Конк (L1, L2, [a, b, c]) = [] = [a, b, c]; = [a] = [b, c]; = [a, b] 2 = [c];
L1 = [a, b, c]
L2 = [];
no
Список [a, b, c] розбивається на два списки чотирма способами, та всі вони були виявлені нашою програмою за допомогою механізму автоматичного перебору.
Нашу програму можна також застосувати для пошуку в списку комбінації елементів, що відповідає деякому умові, що задається у вигляді шаблону або зразка. Наприклад, можна знайти всі місяці, що передують даному, і всі місяці, наступні за ним, сформулювавши таку мету
? - Конк (До, [травень | Після], [Січ, Лют, березень, квітень, травень, червень, липень, серп, вер, жовт, листопад, дек]). p align="justify"> До = [Січ, Лют, березень, квітень]
Після = [червень, липень, серп, вер, жовт, листопад, дек]
Далі ми зможемо знайти місяць, що безпосередньо передує травня, і місяць, безпосередньо наступний за ним, поставивши запитання
? - конк (_, [Мсяц1, травень, Месяц2 | _], [Січ, Лют, березень, квітень, травень, червень, липень, серп, вер, жовт, листопад, дек])
Месяц1 = квітні
Месяц2 = червня
Більше того, ми зможемо, наприклад, видалити з деякого списку L1 все, що слідує за трьома послідовними входженнями елемента z в L1 разом з цими трьома z. Наприклад, це можна зробити так
? - L1 = [a, b, z, z, c, z, z, z, d, e],
конк (L2, [z, z, z | _], L1). = [a, b, z, z, c, z, z, z, d, e], p>
L2 = [a, b, z, z, c]
Ми вже запрограмували відношення приналежності. Однак, використовуючи конк, можна було б визначити це відношення в такий еквівалентним способом:
прінадлежіт1 (X, L): -
конк (L1, [X | L2], L).
У цьому реченні сказано: В«Х належить L, якщо список L можна розбити на два списки таким чином, щоб елемент Х був головою другого з них. Зрозуміло прінадлежіт1 визначає те ж саме ставлення, що і належить. Ми використовували інше ім'я тільки для того, щоб розрізняти таким чином реалізації цього відношення. Зауважимо, що використовуючи анонімну змінну, можна записати вищенаведене пропозиція так
прінадлежіт1 (X, L): -
конк (_, [X | _], L).
Додавання елемента.
Найбільш простий спосіб додати елемент у список - це вставити його в самий початок так, щоб він став його нової головою. Якщо Х - це новий елемент, а список, в який Х додається - L, тоді результуючий список - це просто
[X | L]
Таким чином, для того щоб додати новий елемент в початок списку, не треба використовувати ніякої процедури. Проте, якщо ми хочемо визначити таку процедуру в явному вигляді, то її можна представити у формі такого факту:
додати (Х, L, [X | L]).
Видалення елемента
Видалення елемента Х зі списку L можна запрограмувати у вигляді відношення
в...