Производный класс должен определить все виртуальные функции, которые он наслелует от абстрактного класса. В данном случае класс proposition используется для определения минимального набора возможностей, которыми может обладать класс-потомок. Необходимо также отметить еще одну важную особенность класса proposition (см. листинг 12.1): это шаблонный класс. Он содержит такой член данных: list<C> UniverseOfDiscourse;
Этот член данных предполагается использовать для хранения значения предметной области, к которой относится предположение. В логике область рассуждения содержит все легальные сущности, которые могут рассматриваться при обсуждении. Здесь мы используем контейнер list. Поскольку в общем случае темы обсуждения могут быть самыми разными, мы используем контейнерный класс. Список UniverseOfDiscourse мы объявляем защищенным (protected), а не закрытым (private), чтобы к нему могли получить доступ все потомки класса proposition. Классу proposition также «знакомы» такие понятия модальной логики, как логическая необходимость и вероятность, которые весьма полезны в агентно- ориентированном программировании. Модальнал логика позволяет агенгу различать такие определения, как «вероятно, ИСТИНА» и «несомненно, ИСТИНА». Основные операторы, используемые для выражения логической необходимости и вероятности, перечислены в табл. 12.4. Мы определяем эти методы только в описательных целях; их реализация выходит за рамки рассмотрения в этой книге. Но они являются частью классов предположений, которые мы успешно применяем на практике. Чтобы сделать класс proposition «годным к употреблению», выведем из него новый класс и назовем его trip_announcement. Класс trip_announcement представляет собой утверждение о существовании автобусного маршрута из некоторого исходного пункта (отправления) в пункт назначения. Например, предположим, что существует автобусный маршрут из Детройта в Толедо. Эта информация позволяет сформулировать высказывание, которое может быть либо истинным, либо ложным. Если бы нас интересовало, когда это высказывание истинно или ложно, мы бы воспользовались понятиями временной логики. Временняя логика— это логика времени. Агенты также применяют обоснования, зависящие от времени. Но в данном случае все предположения относятся к текущему времени. Это утверждение декларирует, что в данное вре
// Листинг 12.2. Объявление класса trip_announcement
class trip_announcement :
publiс proposition<trip_announcement>{
//.. .
protected:
string Origin; string Destination;
stack<trip_announcement> 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<trip_announcement>::iterator I,
string TempOrigin);
stack<trip_announcement> candidates(void);
friend bool operator||(bool X,trip_announcement &Y);
friend bool operator&&(bool X,trip_announcement &Y);
//. . .
};
Обратите вни
class trip_announcement :
public proposition<trip_announcement>
{... } ;
обеспечивает класс proposition требуе
Эти члены данных используются для указания пунктов отправления и назначения автобусного маршрута. Если автобусный маршрут требует пересадки с одного автобуса надругой и несколько остановок в пути, то член данных Candidates будет содержать полный путь следования. Следовательно, объект класса trip_armouncement представляет собой утверждение об автобусном маршруте и пути следования. В классе trip_armouncement также определены некоторые дополнительные операторы. Эти операторы позволяют уравнять класс trip_announcement «в правах» со встроенны
// Листинг 12.3. Объявление класса performance_statement
class performance__statement :
public proposition<performance_statement>{
//. . .
int Bays;
float Sales;
float PerHour;
public:
bool operator() (void);
bool operator==(const performance__statement &X) const;
void bays(int X);
int bays(void);
float sales(void);
void sales(float X);
float perHour(void);
void perHour(float X);
friend bool operator||(bool X,performance_statement &Y);
friend bool operator&&(bool X,performance_statement &Y); //. . .