Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОІТ.docx
Скачиваний:
1
Добавлен:
16.08.2019
Размер:
115.47 Кб
Скачать

Це питання можна інтерпретувати як запит «знайти Х і Y» які задовольняють двом умовам: предок (Y, Джим) , предок (X, Y). « , » - означає «і». Якщо поміняти порядок цих двох умов то логічний смисл не зміниться. Тобто можна було питати у будь якому порядку.

Ще одним питанням могло би бути «чи є спільний предок у Енн і Пат». Його так само треба задавати у 2 етапи.

предок(X, Енн) , предок (X, Пат).

Висновки:

  1. На пролозі легко визначити відношення, схоже на відношення предок, сказавши n об’єктів для яких це відношення виконується.

  2. Користувач може легко задавати системі запитання, які стосують ся відношень визначених програмі.

  3. Пролог програма складається з речень кожне з яких закінчується крапочкою.

  4. Аргументи відношення можуть бути: конкретними об’єктами (Том, Енн…) або абстрактними об’єктами (X, Y). Об’єкти першого типу називають атомами, об’єкти другого – змінними.

  5. Питання до системи складається з одного або більше цільових тверджень « , » означає кон’юнкцію « ; » - диз’юнкцію. Пролог система розглядає питання як цілі, яких треба досягти.

  6. Відповідь на питання може бути позитивна або негативна, в залежності від того чи може бути досягнута відповідна ціль. У випадку позитивної відповіді кажуть що ціль успішна, в протилежному випадку – неуспішна.

  7. Якщо на запитання існує декілька відповідей, то Пролог знайде стільки скільки захоче користувач.

Правила

Наш приклад можна розширити кількома способами. Внесемо інформацію про стать людей. Це можна зробити за допомогою таких фактів:

жінка(Пам). чоловік(Том). чоловік(Боб). жінка(Ліз). жінка(Пат).

жінка(Енн). чоловік(Джим).

Ми ввели 2 нові відношення: чоловік і жінка. Ці відношення унарні. Вони використовуються для оголошення наявності або відсутності простих властивостей об’єктів. Цю саму інформацію можна було додати ввівши бінарне відношення «Стать». Тоді новий фрагмент програми виглядав би так:

стать(Пам, жіноча).

стать(Том, чоловіча).

……..

Можна також ввести відношення нащадок, яке є обернене до відношення предок. Можна було б визначити нащадка представивши список простих фактів наявності цього відношення для конкретних пар об’єктів. Наприклад, нащадок(Ліз, Том). Це відношення можна визначити використовуючи той факт, що воно обернене до відношення предок. Такий спосіб базується на логічному твердженні: для всіх X і Y, Y є нащадком X, якщо X є предком Y.

Нащадок(Y, X):- предок(X, Y).

Це речення читається так: для всіх X i Y, якщо X – предок Y. То Y - нащадок X. Такі речення в Пролозі називають правилами. Між фактами і правилами є суттєва різниця. Факт – це дещо, що завжди безумовно істинне, а правила описують твердження, які можуть бути істинними, якщо виконається якась умова. Правила мають умовну частину або тіло, це те що справа від « :- », і частину висновку або голова, це ліва частина. Якщо умова предок(X, Y) виконується то логічним висновком є твердження нащадок(Y, X). Введемо ще одне відношення: мама(X, Y). Воно базується на твердженні: для всіх X і Y, X є матір’ю Y, якщо X є предком Y і X – жінка. На Пролозі це запишеться так: мама(X, Y):- предок(X, Y) , жінка(X).

Відношення можна зображати графами, у яких вершини відповідають об’єктам, дуги відповідають бінарним відношенням (направлені від першого аргумента до другого). Відношення виражені через інші відношення позначають штриховими дугами.

Визначимо відношення сестра(X, Y):

сестра(Y, Z):- предок(X, Y), предок(X, Z), жінка(Y).

Зробити щоб не працювало якщо вводимо сестра сама до себе

Висновки:

  1. Пролог програми можна розширювати додаючи нові речення.

  2. У Пролозі є речення 3-ох типів: факти, правила і запитання.

  3. Факти містять твердження, які безумовно завжди є істинними.

  4. Правила містять твердження, істинність яких залежить від деяких умов.

  5. За допомогою питань користувач може питати систему про те, які твердження є істинними.

  6. Речення у п

15.02.2012

дописати

Обєкти даних Прологу

Проглог розпізнає тип оберту по його синтаксичній формі у тексті програми. Атоми відрізняються від змінних тим що їх імена починаються з малої літери. Щоб система розпізнала тип об’єкта нетреба ніякої додаткової інформації.

Атоми і числа.

Атоми можна створювати 3-ма способами.

  1. Із послідовності букв, цифр і рисочки підкреслення починаючи з малої букви.

  2. Із послідовності спеціальних символів <---> ===> ::=

  3. Послідовність символів у апострофах. Це зручно якщо треба щоби атом починався з великої літери. ‘Том’

Числа у пролозі є цілі і дійсні але використовуються вкрай рідко.

Змінні

Змінні – це послідовності букв, цифр і символів підкреслення, які починаються з великої букви або символа підкреслення.

X _ x25 Result

Якщо змінна зустрічається в реченні тільки 1 раз то не обов’язково давати їй ім’я. Можна використовувати «анонімну змінну» це просто один символ підкреслення. Якщо анонімна змінна зустрічається в питанні то її значення не виводиться при відповіді системи на це питання. Якщо нас цікавлять люди які мають дітей але імена цих дітей не цікавлять тоді треба питати так ?- предок(X, _).

Діапазон видимості фігури для констант один і той самий атом означає той самий об’єкт у будь якому реченні. Тобто область видимості - вся програма.

Структури

Структурні об’єкти – це об’єкти, які складаються із кількох компонент. Ці компоненти у свою чергу також можуть бути структурами. Наприклад дату можна розглядати як структуру з 3-ох елементів: день, місяць, рік. Структури в програмі ведуть себе як 1 ціле. Щоб об’єднати елементи в структуру необхідно вибрати функтом. Для прикладу: дата(15, лютий, 2012).

Елементи структури можуть бути змінними або структурами. Будь який день у лютому можна представити структурою дата(Day, лютий, 2012). Day – це змінна і пізніше їй можна надати потрібного значення. Всі структурні об’єкти можна зобразити у вигляді дерева.

Коренем є функтом, гілки – елементи. Якщо деякий об’єкт структури є структурою, тоді він зображується під деревом дерева структурного об’єкта.

Приклад(представлення …………..)

Розглянемо площину. Точку задаємо 2-ма координатами, відрізок 2-ма точками, трикутник – 3-ма.

Задамо функтори точка, відрізок, трикутник.

Задамо точки P1=точка(1, 1), P2=точка(2, 3), S = відрізок(P1, P2) або S = відрізок(точка(1, 1),точка (2, 3)), T= трикутник(точка(4, 2), точка(6, 4), точка(7,1))

Функтор який є коренем дерева називають головним функтором. Якщо би треба було представити точки трьохвимірного простору то достатньо би задати інший функтор точка3(x, y, z) . можна користуватись одним і тим самим ім’ям для точок 2- і 3-вимірного простору. Якщо одне і теж ім’я використовується в програмі в різних смислах то система буде їх розрізняти по кількості їх аргументів і інтерпретувати ці імена як різні функтори.

Кожен функтор визначається двома параметрами: іменем, синтаксис якого співпадає з синтаксисом атомів; арністю – кількістю аргументів.

Приклад. (a+b)*(c-5). Написати дерево і представити на пролозі.

*(+(a, b), -(c, 5)).

Співставлення.

Синтаксично всі об’єкти даних у Пролозі є термами. Найважливішою операцією над термами є співставлення. Два терми є співставні якщо вони ідентичні або змінним в обох термах можна надати такі значення(конкретизувати), що терми стануть ідентичними. Наприклад, два терми дата(D, M, 2012) і дата(D1, лютий, Y1) співставні. Одною з конкретизацій є така.

D=D1, M=лютий, Y1=2012

Приклад 2. дата(D, M, 2012), дата(D1, M1, 2011) неспівставні.

Означання. Співставлення – це процес на вхід якого подаються два терми, а він перевіряє чи відповідають ці терми один одному. Якщо терми відповідають один одному, то процес успішний, інакше – неуспішний.

Списки.

Список – це проста структура даних, яка використовується у нечисловому програмуванні. Список це послідовність складена з довільної кількості елементів. Наприклад, Енн, теніс, Том, лижі. На пролозі це запишеться так: [Енн, теніс, Том, лижі].

Списки як і всі структурні об’єкти можна представити деревом.

Розглядаються 2 випадки.

  1. Порожній список. Записується атом[]

  2. Непорожній список. Його слід розглядати як структуру яка складається з двох частин. Перший елемент це голова списку, а решта це хвіст. Для нашого прикладу Енн це голова, а [теніс, Том, лижі] це хвіст. Голова з’єднується з хвостом за допомогою спеціально функтора « . ». Головою може бути будь який прологівський об’єкт а хвіст обов’язково повинен бути списком.

Список записуємо так .(голова, хвіст). Оскільки хвіст це список, то він або порожній, або має власні голову і хвіст.

.(Енн, .(теніс, .(Том, .(лижі, []))))

Інший спосіб представлення списків це послідовність елементів у квадратних душках розділених комами. Два способи представлення є еквівалентні.

22.02.2012

Приклад

?- Список1=[a, b, c],

Список2=.(a,.(b,.(c,[]))).

Відповідь:

Список1=[a, b, c]

Список2=[a, b, c]

?- Захоплення1=.(теніс,.(музика,[]))),

Захоплення2=[лижі, їжа],

L=[Енн, Захоплення1, Том, Захоплення2].

Відповідь:

Захоплення1=[теніс, музика],

Захоплення2=[лижі, їжа],

L=[Енн, [теніс, музика], Том, [лижі, їжа]].

При представленні списків як роздільних елементів можна використовувати і символ «|».

Тоді список [a|[b,c]]=[a,b,c|[ ]] L=[ Голова|Хвіст]

Висновки:

  1. Список – це структура даних, яка може бути порожняя або мати голову і хвіст, який також може бути списком

  2. Список в Пролозі розглядається як частковий випадок двійкового(бінарного) дерева.

Операції над списками

Списки можна використовувати для представлення множин. Між ними є різниця:

  1. Порядок елементів множини неважливий, для списку порядок має значення.

  2. Один і той самий об’єкт може зустрічатися у списку декілька раз.

Найчастіше вживані операції над списками аналогічні операціям над множинами

  1. Перевірка чи належить деякий елемент списку.

  2. Конкатенація і об’єднання списків

  3. Додавання нового елемента у список або вилучення елемента зі списку.

Входження елемента до списку представимо таким відношенням.

Належить(X, L). Означатиме що елемент X належить списку L.

Приклад:

?- Належить (b, [a, b, c]). yes

?- Належить (b, [a, [b,c]]). no

?- Належить([b,c], [a,[b,c]]). yes

Відношення належності будемо будувати з таких міркувань

  1. X – голова списку L Належить (X, [X|Хвіст])

  2. X належить хвосту списку L Належить(X, [Голова|Хвіст]):- належить (X, Хвіст)

Конкатенація(Обєднання)

Визначимо відношення конк(L1, L2, L3),

де L3 – список який отримується об’єднанням списків L1, L2

таке відношення буде істинним. конк([a,b], [c, d], [a,b,c,d])

Визначення відношення конк має два варіанти залежності від списку L1:

  1. Якщо L1 порожній то другий і третій аргументи є одним і тим самим списком конк([ ], L, L).

  2. Якщо L1 не порожній то він має голову і хвіст і зображ. [X, L1]

Результатом об’єднання цього списку з L2 буде список [X, L3].

конк([X|L1], L2, [X|L3]).

?- конк([1, 2, 3], [a, b, c], L).

Відповідь:

L=[1, 2, 3, a, b, c]

?- конк([a, [b, c], d], [a,[ ], b], L).

Відповідь:

L=[ a, [b, c], d, a,[ ], b].

Відношення конк можна використовувати для розбиття списку на 2 частина.

конк(L1, L2, [a, b, c]).

Відповідь будуть всеможливі розбиття. Починаючи з порожнього списку і дальше перебором.

Це відношення конк можна використати для пошуку в списку комбінації елементів, яка відповідає деякій умові.

Приклад

Знайти всі місяці які передують і всі які слідують за певним місяцем.

?- конк(До, [травень|Після], [січень, …..])

Відповідь:

До = [січень, … , квітень]

Після = [червень, … , грудень]

Використовуючи це відношення можна знайти місяць який безпосередньо слідує і передує вказаному.

?- конк(_, [Місяць До, травень, Місяць Після|_], [січень, … ])

Відповідь:

Місяць До = квітень

Місяць Після = червень

Використовуючи це відношення можна з деякого списку вилучати елементи. Наприклад можна вилучити зі списку всі елементи які йдуть після трьох послідовних входжень елемента z

?- L1=[a, b, z, z, c, z, z, z, d ,e], конк(L2, [z, z, z|_], L1).

L1 = [a, b, z, z, c, z, z, z, d ,e]

L2 = [a, b, z, z, c]

Відношення конк можна використати для визначення відношення належності до списку.

Належить1(X, L):- конк(L1, [X | L2], L).

X належить до списку L, якщо список L можна розбити на два списки таким чином, щоб елемент X був головою другого списку. Замість L1, L2 можна писати анонімну змінну.

Додавання нового елемента у список

Найпростіший спосіб додавання елемента у список – вставити його на початок списку. Тоді він стане новою головою списку. Якщо X – це новий елемент, а L – це список, в який треба вставити X, то результатом буде [X|L].

Якщо треба визначити процедуру пишемо: вставити(X, L, [X|L]).

Вилучення елемента зі списку

Для вилучення елемента X зі списку L задамо відношення:

вилучити (X, L, L1), де L1 – співпадає зі списку L в якого вилучений елемент X.

Маємо два випадки:

  1. Якщо X – голова списку тоді результатом буде хвіст.

вилучити(X, [X|Хвіст], Хвіст).

  1. Якщо елемент є у хвості списку тоді треба його вилучити з хвоста. вилучити(X,[Y|Хвіст],[Y,Хвіст]) і вилучити(X,Хвіст,Хвіст1)

Відношення вилучити так само як і відношення належить є не детермінованим. Якщо в списку зустрічається кілька входжень елемента X то це відношення зможе вилучити їх всіх(кожен раз буде вилучений тільки 1 елемент).

?- вилучити(a, [a, b, a, a], L).

Відповіді:

L = [b, a, a];

L = [a, b, a];

L = [a, b, a];

Відношення вилучити можна використовувати для того щоби вставляти елементи в список у довільні місця. Наприклад у всі місця списку [1, 2, 3] треба вставити елемент a

Яким повинен бути список L щоб після вилучення з нього елемента a тримати список [1, 2, 3].

?- вилучити(a, L, [1, 2, 3])

Відповідь:

L = [a, 1, 2, 3];

L = [1, a, 2, 3];

L = [1, 2, a, 3];

L = [1, 2, 3, a];

вставити(X, Хвіст1, Хвіст):- вилучити(X, Хвіст, Хвіст1).

Відношення вилучити можна вилучити для перевірки належності елемента до списку. Виходячи з того що деякий елемент X належить списку L якщо його можна вилучити з цього списку.

належить2(X, L):- вилучити(X, L, _).