У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


буде істинним у випадку, коли Ціль не є істиною. На Пролозі його можна описати наступним чином:

not(P):- P,!, fail;

true.

Пролог система має вмонтований предикат not, реалізований подібним чином.

Тоді наш приклад можна переписати в такому вигляді:

like(wahja,X):- game(X),

not( basketball(X)).

Наступна программа показує використання предикату not.

Єдине, що потрібно відмітити, це те, що: предикат not виконується успішно, коли підціль не є істиною. Іншими словами, not виконується успішно, коли ассоційована з ним підціль не може довести істинність.

domains

name = symbol

gpa = real

predicates

honor_student(name)

student(name, gpa)

probation(name)

clauses

honor_student(Name):-

student(Name, GPA),

GPA>=3.5,

not(probation(Name)).

student("Betty Blue", 3.5).

student("David Smith", 2.0).

student("John Johnson", 3.7).

probation("Betty Blue").

probation("David Smith").

На запит honor_student(Name) вона видрукує список студентів, середній бал яких більший або ж дорівнює 3.5 за виключенням студентів Betty Blue і David Smith, які проходять випробувальний термін.

4.4.Труднощі у використанні відтинання і заперечення.

Виділимо спочатку переваги використання відтинання:

1.За допомогою предикату cut можна підвищити ефективність програми.

2.Використовуючи cut, можна описати взаємовиключні правила, тому є можливість запрограмувати твердження: якщо умова P, тоді розв'язок Q, інакше розв'язок R.

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

Якщо видалення відтинання з програми не міняє її декларативного змісту, тоді таке відтинання називають "зеленим". В іншому випадку відтинання називають "червоним".

Працювати з запереченням також треба обережно. Труднощі виникають тому, що заперечення, яке ми використовуємо, не повністю відповідає математичному запереченню.

Якщо ми побудуємо запит системі:

goal: not(dog(baks)),

вона, можливо, відповість "так". Але цю відповідь не можна розуміти як повідомлення про те, що "Бакс не собака", а потрібно трактувати те, що системі не вистачає інформації для доведення твердження " Бакс - собака". Такий підхід бере свій початок від припущення про замкнутість світу. В відповідності до цього постулату світ замкнутий в тому розумінні, що все, що в ньому існує або ж вказане в програмі, або може бути із неї виведене. І в іншому випадку, якщо щось не міститься в програмі (не може бути з неї виведеним), тоді воно хибне, і відповідно буде істинним його заперечення.

Ми ж традиційно не вважаємо світ замкнутим: якщо в програмі явно не сказано, що dog(baks), тоді це ще не значить, що ми хочемо сказати, що Бакс не собака.

Приведемо ще один приклад обережного використання not:

predicates

r(symbol)

g(symbol)

p(symbol)

clauses

r(a).

g(b).

p(X):-not(r(X)).

На запит goal: g(X), p(X) cистема відповість Х=b, а на запит goal: p(X), g(X) система відповість no (ні). Вся різниця заключається у тому, що в першому випадку змінна Х до моменту обчислення Р(X) була вже зв'язана, а в другому випадку цього ще не трапилось.

4.5.Засоби керування.

Факти та правила Прологу отримують інформацію, якщо вони викликаються з аргументами, які є або ж константами, або ж зв`язаними змінними. Вони повертають інформацію в процедуру виклику шляхом зв`язування змінних аргументів, які не були зв`язані.

Унифікація - це процес обробки на співпадання двох предикатів і призначення вільних змінних. Вона включає наступні кроки:

1.Пролог пробує задовільнити ціль. починаючи з початку програми шукати відповідність.

2.Коли запитується новий виклик, пошук також починається з початку програми.

3.Коли виклик знаходить успішно відповідність (кажуть виклик повертається), викликається наступна підціль.

4.Якщо змінні зв`язані в підпункті, тоді єдиний шлях звільнить їх - бектрекінг.

Можна виділити чотири основні пункти бектрекінгу:

1.Підцілі повинні бути задоволені в послідовності зверху вниз.

2.Пункти предикату тестуються в тому порядку, в якому вони з`являються в програмі при перегляді зверху - вниз.

3.Ціль буде задоволена, якщо буде знайдена відповідність для кожного рівня відповідного дерева.

4.Виклик, який породжує множину рішень, є недетермінованим.

4.6.Узагальнення.

1.Пролог має три предикати для контролю напрямку логічного пошуку вашої програми:

* fail є завідомо невдачею. За допомогою його включається механізм бектрекінгу для пошуку альтернативних рішень;

* not приймає значення істина, коли для асоційованої з ним підцілі не може бути доведено істинність.

* cut - виключає бектрекінг.

2.Можна розглядати, що правила Прологу є визначеннями процедур з точки зору процедурної перспективи. З точки зору процедурної перспективи, правила можна розглядати як варіанти оператору case Паскалю.

Вправи.

4.1.Нехай маємо програму

p: - a, b.

p: - c.

Декларативна сутність якої наступна: р буде істинним тоді і тільки тоді, коли будуть істинні одночасно і а і b, або буде істинним с.

Яким буде декларативна сутність програм?

а) р: - а, ! , b.

p: - c

б) р: - с

р: - a, ! , b.

4.2.Наступні відношення розподіляють числа на три класи - додатні, нуль і від`ємні:

клас (Число, додатні): - Число>0.

клас (0, нуль).

клас (Число, від`ємні): - Число<0.

Зробіть цю процедуру більш ефективною за допомогою відтинання.

4.3.Нехай маємо програму

р(4)

р(5): - !

р(6).

Напишіть відповіді пролог-системи на наступні питання:

а) goal: p(X).

б) goal: p(X), p(Y).

c) goal: p(X), !, p(Y)

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

5.ПРОСТІ ТА СКЛАДНІ ОБ'ЄКТИ.

В цій лекції ми розглянемо весь спектр даних, починаючи з простих і закінчуючи складними даними, які будуються з простих.

5.1 Прості дані.

В якості простих даних виступають змінні або ж константи. Константа може бути або ж символьною (char), або ж числовою (integer, real), атомарною (symbol, string).

Змінна позначається ідентифікатором. Ідентифікатор починається з великої букви у діапазоні від А до Z, або ж символом підкреслення (_). Як ми вже зазначали, єдиний символ


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22