Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Buy_car(corvette,Y)




Goal

Colors(green,preppy).

Colors(black,mean).

Colors(red,sexy).

Car(porsche,red,24000).

Car(corvette,red,26000).

Car(corvette,black,24000).

Clauses

Colors(symbol,symbol)

Buy_car(symbol,symbol)

Goal

F(X,30).

Clauses

F(integer,integer).

Predicates

Clauses

F(integer,integer).

Predicates

Clauses

F(integer,integer).

Predicates

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. Попередня програма прийме вигляд:

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

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

f(X,30):- X ≥ 20.

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

goal: f(22,Y)

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

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

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

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

Предикат cut по-різному діє на складний запит і на множину фраз.

 

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

 

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

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

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

Розглянемо ще один приклад використання cut.

predіcates

car (symbol,symbol,іnteger)

buy_car(Model,Color):- car(Model,Color,Prіce),

colors(Color,sexy),!,Prіce < 25000.

car(maseratі,green,25000).

 

У даному прикладі поставлена ціль: знайти corvette (Корвет) приємного кольору, що підходить за вартістю. Відсікання в правилі buy_car означає, що оскільки в базі даних утримується тільки один "Корвет" приємного кольору, хоч і із занадто високою ціною, то нема потреби шукати іншу машину. Одержавши цільове твердження: buy_car(corvette, Y),

програма зробить наступні кроки:

1.звернеться до car, першої підцілі з тіла предиката buy_car;

2.виконає перевірку для першої моделі, maseratі, що буде невдалою;

3.потім перевірить наступне твердження для car і знаходить відповідність, зв'язуючи змінну Color зі значенням black;

4.переходить до наступного виклику й перевіряє, чи має обрана машина приємний колір. Колір black не є приємним у даній програмі, отже перевірка завершується невдало;

5.виконує пошук з вертанням до виклику car і знов шукає corvette, що задовольняє цьому критерію;

6.знаходить відповідність і знову перевіряє колір. Цього разу колір виявляється приємним, і Vіsual Prolog переходить до наступної підцілі в правилі: до відсікання. Відсікання негайно виконується, "заморожуючи" всі змінні, раніше зв'язані в цьому твердженні;

7.переходить до наступної (і останньої) підцілі в правилі, до порівняння Prіce < 25000;

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

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

 

р: - a,b.




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


Дата добавления: 2014-01-04; Просмотров: 254; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.