Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Clauses. Проаналізуємо, що буде робити програма, коли їй задати наступний запит:




f(X,10):- X < 10.

f(X,20):- X >= 10, X < 20.

f(X,30):- X >= 20.

Проаналізуємо, що буде робити програма, коли їй задати наступний запит:

goal: f(5,Y), Y > 20.

При обчисленні першою цілі f(5,Y), Y приймає значення 10, тому друга підціль стане 10 > 20. Вона закінчується невдачею. Але зрозуміло, що й ввесь список підцілей, який буде перевірятись завдяки бектрекінгу, також буде закінчуватись невдачею.

Всі три правила обчислення функції f є взаємовиключними. Тому ми знаємо, що якщо успіх наступив в одному з них, немає необхідності перевіряти інші, бо вони приречені на невдачу. Отже, якщо в якійсь точці програми наступив успіх, для відміни непотрібного перебору, ми повинні явно вказати Пролог-системі, що не потрібно робити повернення із цієї точки. Це можна зробити за допомогою предикату cut(!). Попередня програма прийме вигляд:

 

Predicates

F(integer,integer).

Clauses

f(X,10):- X < 10,!.

f(X,20):- X >= 10, X < 20,!.

f(X,30):- X >= 20.

Предикат cut не дає робити повернення із тих точок програми, в яких він поставлений і програма стала ефективнішою. Але, якщо ми побудуємо запит типу:

goal: f(22,Y),

тоді Пролог-система зробить три перевірки, і тільки після цього зв'яже з У значення 30. Але ж наші перевірки взаємовиключні. Тому для підвищення ефективності, ми можемо запропонувати такий варіант програми:

Predicates

F(integer,integer).

Clauses

f(X,10):- X < 10,!.

f(X,20):- X < 20,!.

F(X,30).

В цьому випадку предикат відтинання міняє і декларативну сторону програми.

Предикат cut по різному діє на складний запит і на множину фраз. Розглянемо випадок, коли предикат відтинання є однією із підцілей складного запиту:

goal: a(X),b(Y),!,c(X,Y,Z)

При виконанні цього запиту Пролог-система пройде через предикат cut тільки в тому випадку, коли підціль а(X) i підціль b(Y) будуть задоволені. Після того, як підціль cut буде оброблена, система не зможе повернутися назад для повторного розгляду підцілей " а " і " b ", якщо підціль " с " не задовільниться при поточних значеннях Х і У.

Приведемо ще один приклад використання cut:

 

Predicates

Buy_car(symbol, symbol)

Car(symbol, symbol,integer)

Colors(symbol, symbol)

Clauses

buy_car(Model, Color):- car(Model, Color, Price),

colors(Color, sexy),!,

Price < 25000.

Car(maserati, green, 25000).

Car(corvette, black, 24000).

Car(corvette, red, 26000).

Car(porsche, red, 24000).

Colors(red, sexy).

Colors(black, mean).

Colors(green,preppy).

Використання предикату cut говорить про те, що нас спочатку цікавить модель і колір автомобіля, а потім вже ціна.

Для пояснення дії предикату cut повернемося до процесу керування побудови виведення в Пролозі. Нехай прологівська програма має наступний вигляд.

р: - a,b.





Поделиться с друзьями:


Дата добавления: 2015-10-01; Мы поможем в написании ваших работ!; просмотров: 449 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Настоящая ответственность бывает только личной. © Фазиль Искандер
==> читать все изречения...

2312 - | 2040 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.01 с.