Другие примеры

В книге приводились и другие примеры программистских задач, демонстрирующие то, как применение двух правил хорошего стиля программирования приводит к четкому и легко читаемому решению, которое имеет широкую сферу применения. Сравните решение одной и той же задачи при помощи процедуры "место" (см. разд. 3.7), нарушающей первое правило, и при помощи процедуры "найти_или_спросить", которая это правило не нарушает. Сравните решение одной и той же задачи посредством процедуры "итог_окл" из разд. 3.11 и посредством процедур "findall" и "суммировать". В заключение сравните пример "собрание" из разд. 6.3 с аналогичным примером из разд. 6.4, в котором применена процедура "послать". В последнем примере все фразы, ориентированные на конкретное применение, являются структурно изоморфными по отношению к описываемой ими системе, а подробности того, как это достигается, скрыты внутри процедуры "послать".

Пролог как эффективный вычислительный формализм

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

тивный вычислительный формализм для любой конкретной сферы применения. Установление в программе декларативной границы позволяет четко судить о том, какие части программы являются дескриптивными, а какие — обрабатывающими. Как показывает последний пример данной главы, даже управляющую информацию можно включить в дескриптивную часть программы.

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

Библиографические заметки

Общепринятое определение экспертной системы можно найти в книге [42]. Бихевиористическое определение дано в работе [58].

Многие экспертные системы обладают способностью объяснять свои ответы. Прототипом того, как выдается объяснение в процедуре "вып", послужило аналогичное свойство языка APES [38].

Процедура "вып" является аналогом процедуры "eval" [23]. Различные виды интерпретаторов, обнаруживающих циклы, рассматриваются в докладе [II].

Обсуждение стиля программирования на Прологе, приведенное в конце главы, во многом сходно с материалом, изложенным в работе [58].

Упражнения

1. Введите базу данных "путешествие/4", содержащую циклические данные, а затем воспользуйтесь программой "иоц" для выполнения запроса к процедуре "можно _путешествовать4". Что получится в результате этих действий?

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

2. Вызов процедуры "findall" (см. разд. 3.9) объявляет отношение между запросом и всеми ответами на этот запрос; вызов процедуры "послать" (см. разд. 6.4) объявляет, доказуем ли запрос в соответствии с фразами, которые связаны с определенным состоянием. Какое отношение объявляет ' вызов процедуры "поместить" (см. разд. 6.5) ? Можно ли переписать процедуру "поместить" так, чтобы она стала обладать более четким декларативным смыслом?

3. Процедура "рз" (см. разд. 75) может оптимизировать выполнение запросов к отношению, вид которого объявлен как "один_много". Попытайтесь расширить процедуру "рз" так, чтобы она смогла оптимизировать запросы к отношениям, вид которых объявлен как "один_один" и "много_один" (см. разд. 1.7) .

Соседние файлы в папке Гл.6,7,Прилож.,Допол