оператор operator () определяется так.
>bool trip_announcement::operator()(void) {
>list::iterator I;
>if(directTrip()){
> return(true);
>}
>I = UniverseOfDiscourse.begin();
>if(validTrip(I, Origin)){
> return(true);
>}
>return(false);
>}
При выполнении этого кода станет ясно, существует ли маршрут из заданного исходного пункта в некоторый пункт назнаначения. Например, предположим, что нас интересует переезд из Детройта в Колумбус, при этом область рассуждений содержит следующие данные:
Детройт - Толедо
Толедо - Колу м бус
Тогда объект класса trip_announcement «доложит» о то м, что утверждение о су щ ествовании автобусного м аршрута из Детройта в Колу м бус истинно, нес м отря на то, что область рассуждений не содержит утверждения о пря м о м маршруте:
Детройт - Колу м бус
Объект класса trip_announcement действительно проверит, существует ли прямой маршрут из Детройта в Колумбус. Если он существует, объект возвратит значение ИСТИНА. В противном случае он попытается найти обходной путь. Подобное поведение реализуется так.
>if(directTrip()){
> return(true);
>}
>I = UniverseOfDiscourse.begin();
>if(validTrip(I,Origin)){
> return(true);
>}
«Самоопределением» истинности объект обязан оператору operator () класса trip_anouncement. Метод directTrip () довольно прост, и его работа заключается в последовательном просмотре области рассуждений на предмет существования следующего утверждения:
Детройт - Колу м бус
Метод >validTrip ()
, чтобы узнать, существует ли обходной путь, использует технологию поиска вглубь (Depth First Search— DFS). Определения методов >validTrip ()
и >directTrip ()
приведены в листинге 12.7.
>// Листинг 12.7. Определения методов validTrip() и // directTrip()
>bool trip_announcement::validTrip(list::iterator I, string TempOrigin)
>{
>if(I == UniverseOfDiscourse.end()){ if(Candidates.empty()){ TruthValue = false; return(false);
>}
>else{
>trip_announcement Temp; Temp = Candidates.top(); I = find(UniverseOfDiscourse.begin(), UniverseOfDiscourse.end(),Temp); UniverseOfDiscourse.erase(I); Candidates.pop(); I = UniverseOfDiscourse.begin(); if(I != UniverseOfDiscourse.end()){ TempOrigin = Origin;
>} else {
> TruthValue = false; return(false);
>}
>}
>>
>if((*I).origin() == TempOrigin &&
>(*I).destination() == Destination){ Candidates.push(*I); TruthValue = true; return(true);
>}
>if((*I).origin() == TempOrigin){ TempOrigin = (*I).destination(); Candidates.push(*I);
>}
>I++;
>return(validTrip(I,TempOrigin));
>bool trip_announcement: :directTrip(void) {
>list::iterator I; I = find(UniverseOfDiscourse.begin(),