Параллельное и распределенное программирование на С++ (Хьюз, Хьюз) - страница 334

>

Этот метод передает контейнер UniverseOfDiscourse каждому из объектов предположен и й. После это г о он использует утверждение, выраженное в следую щ ей форме: (А v В v С) ^ (Q v R v S) --> W

Это выражение можно озвучить так: если хотя бы одно из утверждений каждой группы истинно, то элемент W примет значение ИСТИНА. Для наше г о а г ента это означает, что если дости г нута хотя бы одна из целей эффективности бизнеса и существует хотя бы один из приемлемых автобусных м аршрутов, то отпуск м ожно планировать. Определение м етода determineVacationAppropriate () представлено в листинге 12.10.

>// Листинг 12.10. Второй метод рассуждений

>bool agent::determineVacationAppropriate(void) {

>bool TruthValue;

>Managerl.universe(PerformanceBeliefs);

>Manager2.universe(PerformanceBeliefs);

>Manager3.universe(PerformanceBeliefs);

>Tripl.universe(TripBeliefs);

>Trip2.universe(TripBeliefs);

>Trip3.universe(TripBeliefs);

>TruthValue = ((Managerl || Manager2 || Manager3) &&

> (Tripl || Trip2 || Trip3)); return(TruthValue);

>}

Обратите внимание на то, что списки TripBeliefs и PerformanceBeliefs являются аргументами метода universe() объектов Trip и Manager. Именно здесь объекты предположений получают информацию из предметной области (UniverseOfDiscourse). Прежде чем объект класса proposition вызовет оператор operator(), его контейнер UniverseOfDiscourse должен заполниться имеющимися у агента данными. В листинге 12.10 при вычислении выражения

>((Managerl || Manager2 || Manager3) && (Tripl || Trip2 || Trip3));

оценивается шесть предположений (посредством выполнения оператора "||"). Оператор " | |" для каждого предположения выполняет оператор operator (), который для определения истинности предположения использует список UniverseOfDiscourse. Слелует иметь в виду, что классы trip_announcement Hperformance_statement наследуют довольно много функций класса proposition. В листингах 12.6 и 12.7 было показано, как определяется оператор operator() для класса trip_announcement, а в листинге12.11 приведено определение оператора operator () для класса performance_statement.

>// Листинг 12.11. Класс performance_statement

>bool performance_statement::operator()(void) {

>bool Satisfactory = false;

>list::iterator I;

>I = UniverseOfDiscourse.begin();

>while(I != UniverseOfDiscourse.end() && !Satisfactory) {

> if(((*I).bays() >= Bays) || ((*I).sales() >= Sales)

> || ((*I).perHour() >=PerHour)){ Satisfactory = true;

> }

> I++;

>}

>return(Satisfactory);

>}

Оператор operator () для каждого класса proposition играет «свою» роль в способности класса агента делать логические выводы. В листинге 12.6 показано, как вызывается оператор operator () при каждом вычислении оператора " || " или "&&" для класса proposition или для одного из его потомков. Именно такое сочетание методов operator (), определенных в proposition-классах, и методов класса agent образует стратегии логического вывода для класса agent. В дополнение к операторам "||" и "&&", определенным в классе proposition, классы trip_announcement и performance_statement содержат свои определения.