идалити (Х, L, L1)
де L1 збігається зі списком L, у якого вилучений елемент Х. ставлення видалити можна визначити аналогічно відношенню приналежності. Маємо знову два випадки:
1) Якщо Х є головою списку, тоді результатом видалення буде хвіст списку.
2) Якщо Х знаходиться в кінці списку, тоді його потрібно видалити звідти.
видалити (Х, [X | Хвіст], Хвіст).
видалити (Х, [Y | Хвіст], [Y | Хвост1]): -
видалити (Х, Хвіст, Хвост1).
Як і належить, ставлення видалити за природою своєю недетермінованих. Якщо в списку зустрічається кілька входжень елемента Х, то видалити зможе виключити їх все за допомогою повернень. Звичайно, обчислення по кожній альтернативі буде видаляти лише одне входження Х, залишаючи інші в недоторканності. Наприклад:
? - Видалити (a, [a, b, a, з, a], L). = [B, a, з, a]; = [a, b, с, a]; = [a, b, a, с];
no
При спробі виключити елемент, що не міститься в списку, ставлення видалити потерпить невдачу.
Ставлення видалити можна використовувати у зворотному напрямку для того, щоб додавати елементи в список, вставляючи їх у довільні місця. Наприклад, якщо ми хочемо у всілякі місця списку [1, 2, 3] вставити атом а, то ми можемо це зробити поставивши запитання: В«Яким повинен бути список L, щоб після видалення з нього елемента а вийшов список [1, 2, 3 ]? В»
? - видалити (a, L, [1, 2, 3]). = [a, 1, 2, 3]; = [1, a, 2, 3]; = [1 , 2, a, 3];
L = [1, 2, 3, a];
no
Взагалі операція з внесення Х в довільне помста деякого списку Список, що дає в результаті БольшійСпісок, може бути визначена пропозицією:
внести (Х, Список, БольшійСпісок): -
видалити (Х, БольшійСпісок, Список).
У прінадлежіт1 ми витончено реалізували відношення приналежності через конк. Для перевірки на приналежність можна також використовувати і видалити. Ідея проста: певний Х належить списку Список, якщо Х можна з нього видалити:
прінадлежіт2 (Х, Список): -
видалити (Х, Список, _).
39. Функціональні атрибути. Автоматичні міркування, що використовують фрейми. Ієрархічні міркування, що використовують фрейми. Міркування з умовчаннями
Функціональні атрибути
Атрибути описують безліч характеристик пов'язаних з функціями функціонального фрейму. Атрибут не обов'язково є конкретизацією деяких даних на зразок Жак_2; з тим же успіхом він може бути функціональним виразом. Розглянемо фразу В«Жак посилає книгу Марі, а Поль отримує лист від людини, якій Жак послав книгуВ». Її перша частина виражається фреймом
Посилка_8
елем: (елем_із посилок)
відправник: Жак_2
одержувач: Марі_4
об'єкт: Кніга_22
Друга частина представляється фреймом, для якого якесь функціональне вираз є атрибутом В«відправникаВ»:
Посилка_9
елем: (елем_із посилок)
відправник: одержувач (Посилка_8)
одержувач: Поль_6
об'єкт: Пісьмо_3
Марі_4 і одержувач (Посилка_8) - два різні способи представлення одного і того ж особи.
Якщо намагаємося встановити паросполучення між фреймами, що містять функціональні вирази в якості атрибутів, то слід припустити, що ці вирази отримають значення відразу, як тільки це буде можливо. Присвоєння значень здійснюється за допомогою посилання на об'єкт, зазначений аргументом цієї функції. p align="justify"> Припустимо, що поставлено питання: В«Посилала Чи Марі-небудь кому-небудь?В», представлений фреймом-метою
z (x)
елем: (елем_із посилок)
відправник: Марі_4
одержувач: х
об'єкт: у
Безліч фреймів-фактів містять Посилку_8 і Посилку_9. Так як одержувач (Посилка_8) може отримати значення Марі_4, то фрейм Посилка_9 отримає Марі_4 в якості значення функції відправник. Відповідь на питання дасть паросполучення фрейму Посилка_9 з фреймом z. p align="justify"> За допомогою підстановки {(х, Поль_6), (у, Пісьмо_3)} можна отримати відповідь В«так, Марі відправила лист ПолюВ»
Автоматичні міркування, що використовують фрейми
Тільки що ми розглянули, що а...