>
Этот метод передает контейнер 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 содержат свои определения.