4.4. Проблемы, связанные с использованием отсечения

4.4. Проблемы, связанные с использованием отсечения

Мы уже убедились в том, что иногда необходимо учитывать стратегию, используемую в Прологе для поиска в базе данных, и что порядок записи утверждений в программе на Прологе влияет на результат доказательства согласованности целевых утверждений. Проблема, связанная с введением отсечений, заключается в том, что мы должны еще более детально знать, как именно будут использоваться правила программы. Ибо, когда правило используется одним способом, отсечение может быть безвредным или даже полезным, в то время как при другом способе употребления правила отсечение может привести к непредвиденному результату. Рассмотрим измененное определение предиката присоединить, приведенное в предыдущем разделе:

присоединить([],Х,Х):-!.

присоединить[А|В],С,[А|D]:- присоединить(В,С,D).

Когда мы имеем дело с целевыми утверждениями, подобными

присоединить([а,b,с],[d,е],Х)

и

присоединить([а,b,с],Х,Y)

то использование отсечения вполне уместно. Если первый аргумент такого целевого утверждения уже имеет некоторое значение, то единственный смысл отсечения – это подтверждение того, что когда значение первого аргумента есть [], то только первое правило применимо. Однако рассмотрим, что произойдет, если мы имеем целевое утверждение

присоединить(Х,Y,[а,b,с]).

Это целевое утверждение будет сопоставлено с заголовком первого правила, что даст

X = [], Y = [a,b,c]

но затем встретится отсечение. Это приведет к тому, что будет заморожен сделанный нами выбор правила, и как следствие в случае если мы обратимся за новым решением, ответ будет «нет», даже если в действительности для данного запроса имеются другие решения.

Приведем другой интересный пример того, что может произойти, если правило, содержащее отсечение, используется незапланированным способом. Давайте определим предикат число_родителей, который дает информацию о том, сколько родителей имеет человек. Мы можем определить его следующим образом:

число_родителей(адам,0):-!.

число_родителей(ева,0) :-!.

число_родителей(Х,2).

то есть число родителей для адам и ева равно 0, а для всех остальных равно 2. Если мы всегда используем наше определение предиката число_родителей для определения числа родителей некоторого данного человека, то все идет нормально. Мы получаем

?- число_родителей(ева,Х).

X = 0; нет

?- число_родителей(джон,Х).

X = 2;

нет

и так далее, как это и требуется. Отсечение необходимо, чтобы предотвратить процесс возврата, который мог бы привести к третьему правилу в случае, когда человек – это адам или ева. Однако рассмотрим, что произойдет, если мы используем те же самые правила, чтобы проверить, что данный человек имеет данное число родителей. Все хорошо, за исключением того, что мы получаем

?- число_родителей(ева,2).

да

Вам следует самостоятельно разобраться, почему так получается – это просто следствие стратегии, применяемой в Прологе для поиска в базе данных. Наша реализация обработки «остальных» случаев, основанная на использовании отсечения, просто больше не работает надлежащим образом. Существуют два способа изменить определение, которые позволили бы нам устранить указанный эффект:

число_родителей(адам,N):-!, N=0.

число_родителей(ева,N):-!, N=0.

число_родителей(Х,2).

или

число_родителей(адам,0).

число_родителей(ева,0).

число_родителей(Х,2):- X = адам, X = ева.

Конечно, эти определения по-прежнему не работают, если задать целевое утверждение вида

?- число_родителей(Х,Y).

ожидая, что возврат позволит перечислить все возможности. Таким образом, можно сделать следующий вывод:

Если вы вводите отсечения для того, чтобы обеспечить правильную работу программы для целевых утверждений определенной формы, то нет гарантии, что при появлении целевых утверждений иной формы будет происходить что-либо разумное. Отсюда следует, что надежное использование отсечения возможно лишь в том случае, когда вы имеете четкое представление о том, как ваши правила будут использоваться. Если характер использования правил меняется, то необходимо пересмотреть все случаи употребления отсечения.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

12.1 ПРОБЛЕМЫ, СВЯЗАННЫЕ С МНОГОПРОЦЕССОРНЫМИ СИСТЕМАМИ

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

12.1 ПРОБЛЕМЫ, СВЯЗАННЫЕ С МНОГОПРОЦЕССОРНЫМИ СИСТЕМАМИ В главе 2 мы говорили о том, что защита целостности структур данных ядра системы UNIX обеспечивается двумя способами: ядро не может выгрузить один процесс и переключиться на контекст другого, если работа производится в


4.3. Общие случаи использования отсечения

Из книги Программирование на языке Пролог автора Клоксин У.

4.3. Общие случаи использования отсечения Мы можем выделить три основных случая использования отсечения.Первый связан с ситуациями, когда мы хотим указать Пролог-системе, что она нашла нужное правило для заданного целевого утверждения. В этом случае отсечение означает:


Проблемы, связанные с глобальными объектами

Из книги Примеры использования Паттерн Singleton (Одиночка) автора Федоров Дмитрий

Проблемы, связанные с глобальными объектами При разработке больших проектов, часто возникает необходимость обращаться из одного модуля программы к объектам, существующим в другом модуле. Такие объекты, как правило, существуют в единичных экземплярах, поэтому наиболее


Связанные документы

Из книги Реестр Windows автора Климов Александр

Связанные документы В последних версиях Windows появилось понятие сопоставленных файлов. Например, если вы собираетесь переместить или удалить html-документ, то будут также перемещены или удалены и сопоставленные с этим документом файлы, которые содержаться в папке


Связанные текстовые фреймы

Из книги Adobe InDesign CS3 автора Завгородний Владимир

Связанные текстовые фреймы При работе с большими фрагментами текста одного фрейма будет недостаточно. Во-первых, мы можем захотеть сверстать текст в несколько колонок. Это можно решить с помощью настроек собственно фрейма (об этом будет сказано в главе 13) или же создать


Связанные файлы

Из книги Человеческий фактор в программировании автора Константин Ларри Л

Связанные файлы В связи с тем что в профессиональной графике файлы изображений могут достигать большого размера – действительно большого, десятки и сотни мегабайт, – многие программы макетирования и верстки не включают файлы изображений в документ. Так поступает и


48 Связанные объекты

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

48 Связанные объекты Что делает тот или иной предмет легким для понимания? Что делает тот или иной предмет простым в использовании? Что превращает совокупность объектов — не отдельных, а представленных в определенном контексте — в набор рабочих инструментов? Возьмем


У15.5 Связанные стеки

Из книги Системное программирование в среде Windows автора Харт Джонсон М

У15.5 Связанные стеки Основываясь на классах STACK и LINKED_LIST, постройте класс LINKED_STACK, описывающий реализацию стека как связного


Изменения, связанные с использованием API

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Изменения, связанные с использованием API Наиболее заметные изменения, связанные с использованием API, затрагивают функции управления памятью, введенные в главе 5. В новых определениях в полях счетчиков используется тип данных SIZE_T (см. табл. 16.2). Например, теперь прототип


1.7.4 Связанные документы

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

1.7.4 Связанные документы Серия RFC не содержит спецификаций протоколов и была опубликована как отдельный набор документов For Your Information (FYI — К вашему сведению). Например: RFC 1325 Answers to commonly asked "new Internet user" questions (Ответы на наиболее распространенные вопросы новых пользователей


18.1.3. Ограничения, связанные со временем

Из книги MySQL 5.0. Библиотека программиста автора Гольцман Виктор Иосифович

18.1.3. Ограничения, связанные со временем В 32-разрядных системах Linux, как и в большинстве систем Unix, переменная time_t является целым числом со знаком длиной 32 бита. Это означает, что в 10:14:07 вечера 18 января (четверг) 2038 года она переполнится. Поэтому время 10:14:08 вечера 18 января


6.4. Проблемы, связанные с блокировками

Из книги Справочник по параметрам BIOS автора Вонг Адриан

6.4. Проблемы, связанные с блокировками В этом разделе мы рассмотрим только внутренние блокировки, используемые сервером MySQL при совместной работе нескольких потоков с одними и теми же данными, и не коснемся внешних блокировок, обеспечивающих координацию работы сервера


Неполадки, связанные с BIOS

Из книги Оптимизация BIOS. Полный справочник по всем параметрам BIOS и их настройкам автора Вонг Адриан

Неполадки, связанные с BIOS В этой книге мы расскажем, как оптимизировать BIOS, а не о том, насколько сильно вы можете «разгонять» систему. Существует огромное число различных конфигураций, и о них невозможно рассказать ни в этой книге, ни в любой другой.Если вы любите


Неполадки, связанные с BIOS

Из книги Разработка ядра Linux автора Лав Роберт

Неполадки, связанные с BIOS В этой книге мы расскажем, как оптимизировать BIOS, а не о том, насколько сильно вы можете «разгонять» систему. Существует огромное число различных конфигураций, и о них невозможно рассказать ни в этой книге, ни в любой другой.Если вы любите


Приложение А Связанные списки

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Приложение А Связанные списки Связанный список — это структура хранения информации (контейнер), которая может содержать переменное количество элементов данных, часто называемых узлами, и позволяет манипулировать этими данными. В отличие от статического массива,


Задания, связанные с ЕГЭ по информатике

Из книги автора

Задания, связанные с ЕГЭ по информатике Начиная с версии 4.10, задачник Programming Taskbook включает набор групп заданий, связанных с ЕГЭ по информатике и ИКТ. Эти группы начинаются с префикса Exam; они доступны для программных сред языков Pascal (в том числе PascalABC.NET) и C++.В базовый набор