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

оператор 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(),