Класс proposition (см. листинг 12.1) представляет собой упрощенную версию (с сокращённым набором функциональных возможностей). Назначение этого класса— сделать использование типа данных proposition таким же простым и естественным, как использование любого другого С++-типа данных. Обратите внимание на слелующее объявление в классе proposition: virtual bool operator()(void) = 0;
Таблица 12.4. Преобразование операторов влогические
Пользовательские C++onepamopы Распространенныелогические операторы
&& ^
|| v
! ~
possible ♦
necessary □
Это объявление чисто виртуального метода. Если в классе объявлен чисто виртуальный метод, это означает, что данный класс — абстрактный, и из него нельзя создавать объекты, поскольку в нем отсутствует определение этого метода. Метод лишь объявлен, но не определен. Абстрактные классы используются для определения стратегий и являются своего рода проектами производных классов. Производный класс должен определить все виртуальные функции, которые он наслелует от абстрактного класса. В данном случае класс propositionиспользуется для определения минимального набора возможностей, которыми может обладать класс-потомок. Необходимо также отметить еще одну важную особенность класса proposition(см. листинг 12.1): это шаблонный класс. Он содержит такой член данных: list UniverseOfDiscourse;
Этот член данных предполагается использовать для хранения значения предметной области, к которой относится предположение. В логике область рассуждения содержит все легальные сущности, которые могут рассматриваться при обсуждении. Здесь мы используем контейнер list.Поскольку в общем случае темы обсуждения могут быть самыми разными, мы используем контейнерный класс. Список UniverseOfDiscourseмы объявляем защищенным (protected),а не закрытым (private),чтобы к нему могли получить доступ все потомки класса proposition.Классу propositionтакже «знакомы» такие понятия модальной логики, как логическая необходимость и вероятность, которые весьма полезны в агентно-ориентированном программировании. Модальнал логика позволяет агенгу различать такие определения, как «вероятно, ИСТИНА» и «несомненно, ИСТИНА». Основные операторы, используемые для выражения логической необходимости и вероятности, перечислены в табл. 12.4. Мы определяем эти методы только в описательных целях; их реализация выходит за рамки рассмотрения в этой книге. Но они являются частью классов предположений, которые мы успешно применяем на практике. Чтобы сделать класс proposition«годным к употреблению», выведем из него новый класс и назовем его trip_announcement.Класс trip_announcementпредставляет собой утверждение о существовании автобусного маршрута из некоторого исходного пункта (отправления) в пункт назначения. Например, предположим, что существует автобусный маршрут из Детройта в Толедо. Эта информация позволяет сформулировать высказывание, которое может быть либо истинным, либо ложным. Если бы нас интересовало, когда это высказывание истинно или ложно, мы бы воспользовались понятиями временной логики. Временняя логика— это логика времени. Агенты также применяют обоснования, зависящие от времени. Но в данном случае все предположения относятся к текущему времени. Это утверждение декларирует, что в данное вре м я существует автобусный м аршрут из Детройта в Толедо. Агент должен «у м еть» удостовериться в этом и либо «довериться» это м у факту, либо отвергнуть его как ложное высказывание. Теперь м ожно расс м отреть объявление класса trip_armouncement,представленное в листинге 12.2.
// Листинг 12.2. Объявление класса trip_announcement
class trip_announcement :
publiс proposition{
//.. .
protected:
string Origin; string Destination;
stack Candidates; public:
bool operator()(void);
bool operator==(const trip_announcement &X) const;
void origin(string X);
string origin(void);
void destination(string X);
string destination(void);
bool directTrip(void);
bool validTrip(list::iterator I,
string TempOrigin);
stack candidates(void);
friend bool operator||(bool X,trip_announcement &Y);
friend bool operator&&(bool X,trip_announcement &Y);
//. . .
};
Обратите вни м ание на то, что класс trip_armouncementнаследует класс proposition.Вспо м ните, что класс propositionявляется шаблонным и требует задания параметра, определяющего тип. Объявление
class trip_announcement :
Читать дальше