• Nie Znaleziono Wyników

Tajni Współpracownicy i Opozycyjni EtosowcyEtosowcy

rozwiązań dopuszczalnych

3.6 Propagacja ograniczeń czasami wystarcza

3.6.4 Tajni Współpracownicy i Opozycyjni EtosowcyEtosowcy

ECLiP Sema również bibliotekę ograniczeń symbolicznych (ic_symbolic), wspie-rającą ograniczenia dla zmiennych definiowanych za pomocą nazw. Wymaga ona prefiksowania symboli operacji na nazwach symbolem &. Zastosowania tej biblio-teki ilustruje następujący przykład:

Członkami ekskluzywnego klubu ”Black and White” mogą być wyłącznie byli Tajni Współpracownicy oraz byli Opozycyjni Etosowcy. Taki wybór profilu klubu okazał się strzałem w dziesiątkę. Sprzyja on ożywionym i kontradyk-toryjnym dyskusjom klubowym ściągającym liczną publiczność oraz wpływa korzystnie na konsumpcję wszystkich tych produktów, bez których nie sposób zrozumieć całej złożoności uwarunkowań, w których członkom klubu przyszło kiedyś żyć i pracować. Atrakcyjność dyskusji jest dodatkowo wzmacniana po-wszechną wiedzą o tym, że Opozycyjni Etosowcy zawsze mówią prawdę, zaś Tajni Współpracownicy na przemian kłamią i mówią prawdę. Poczytny tabloid

głównego nurtu ”Der Rynsztok” wysłał ostatnio do klubu swego dziennikarza w nadziei na odpowiednio skandalizujący reportaż. Niestety, dziennikarz na sa-mym początku napotkał na zasadniczą trudność: w klubie owego dnia byli tylko trzej członkowie, z których dwaj, Członek_1 i Członek_2, zaciekle się kłócili, co wskazywało na ich przynależność do różnych grup klubowiczów. Dzienni-karz, nie chcąc przeszkadzać adwersarzom, zapytał Członka_3, nie biorącego udziału w dyskusji, czy jest byłym Opozycyjnym Etosowcem, czy też byłym Tajnym Współpracownikiem. Niestety, Członek_3 był po tak intensywnych pró-bach zrozumienia złożoności wzmiankowanych uwarunkowań, że tylko burknął coś niezrozumiałego. Dziennikarz zwrócił się więc do pozostałych członków z prośbą o wyjaśnienie, co też takiego powiedział Członek_3. Członek_1 wyja-śnił mu: ”Członek_3 rzekł, że jest byłym opozycyjnym etosowcem”. Członek_2 natomiast najpierw powiedział: ”Członek_3 jest tajnym współpracownikiem”, a potem dodał: ”Członek_3 kłamał”.

Czy dziennikarz ma wystarczająco danych, by stwierdzić kto jest kim?

Aby lepiej zrozumieć problem, popatrzmy na jego przestrzeń stanu zapi-saną w postaci tabeli prawdy z rysunku 3.13. Tabelę tę opisują trzy zmienne boolowskie (C1, C21 i C22), odpowiadające wartościom logicznym wypowiedzi Członka_1, pierwszej wypowiedzi Członka_2 i drugiej wypowiedzi Członka_2.

Przyjęto, że wartość 0 oznacza, że odpowiednia wypowiedź jest kłamstwem, a wartość 1 - prawdą. Rozpatrywana przestrzeń stanu ma osiem stanów (C1, C21, C22), wynikających z współrzędnych wierszy i kolumn tablicy.

Rysunek 3.13: Tablica prawdy przestrzeni stanu dla przykładu TW-OE

Liczby wewnątrz tabeli są wartością logiczną koniunkcji wszystkich ograni-czeń przykładu: 0 oznacza niespełnienie ograniograni-czeń, 1 oznacza spełnienie ogra-niczeń. I tak:

• pierwsza kolumna musi zawierać zera, gdyż żaden członek klubu nie wy-powiada kolejno dwóch kłamstw;

• druga kolumna jest ”wewnętrznie sprzeczna”: jeżeli Członek_3 kłamał, to pierwsza odpowiedź Członka_2 nie może być kłamstwem;

• to samo odnosi się do czwartej kolumny: jeżeli Członek_3 nie kłamał, to oczywiście pierwsza odpowiedź Członka_2 nie może być prawdą;

• rozpatrzmy dolny kwadrat kolumny trzeciej: jeżeli wypowiedź Członka_1 jest prawdą, to obydwie wypowiedzi Członka_2 nie mogą być prawdą;

• pozostaje więc górny kwadrat kolumny trzeciej, który odpowiada spełnio-nej koniunkcji warunków czyli stanowi dopuszczalnemu: jeżeli odpowiedź Członka_1 jest kłamstwem, wówczas obydwie odpowiedzi Członka_2 są prawdą;

• stąd wynika, że Członek_1 i Członek_3 są byłymi Tajnymi Współpra-cownikami, natomiast Członek_2 jest byłym Opozycyjnym Etosowcem, Q.E.D.

Po upewnieniu się co do istnienia rozsądnego i jednoznacznego rozwiązania, przejdźmy do programu 3_5_black_and_white.ecl4:

/*1*/ :- lib(ic).

/*2*/ :- lib(ic_symbolic).

/*3*/ :- local domain(czlonek(opozycyjny_etosowiec,tajny_wspolpracownik)).

/*4*/ top

:-/*5*/ wyznacz(_).

/*6*/

wyznacz([Czlonek_1,Czlonek_2,Czlonek_3]):-% Deklaracja dziedziny zmiennej symbolicznej:

/*7*/ [Czlonek_1,Czlonek_2,Czlonek_3] &:: czlonek,

% Deklaracja dziedziny zmiennej dwuwartościowej:

/*8*/ [Czlonek_3_Byc_Moze_Rzekl,Czlonek_3_Rzekl, Czlonek_1_Rzekl,Czlonek_2_Rzekl_Najpierw,

Czlonek_2_Rzekl_Potem] :: 0..1,

4Program ten bazuje na programie ”Liars” opracowanym przez J. Schimpf’a, zob.

[Schimpf-10a].

/*9*/ Czlonek_1 &\= Czlonek_2,

% Co Czlonek_3 być może powiedział:

/*10*/ Czlonek_3_Byc_Moze_Rzekl #= (Czlonek_3 &= opozycyjny_etosowiec), /*11*/ pojedyncze_stwierdzenie(Czlonek_3,

Czlonek_3_Byc_Moze_Rzekl),

% Co Czlonek_1 powiedział:

/*12*/ Czlonek_1_Rzekl #= (Czlonek_3_Rzekl #=

Czlonek_3_Byc_Moze_Rzekl),

/*13*/ pojedyncze_stwierdzenie(Czlonek_1, Czlonek_1_Rzekl),

% Co Czlonek_2 rzekł najpierw:

/*14*/ Czlonek_2_Rzekl_Najpierw #= (Czlonek_3 &=

tajny_wspolpracownik), /*15*/ pojedyncze_stwierdzenie(Czlonek_2,

Czlonek_2_Rzekl_Najpierw),

% Co Czlonek_2 rzekł potem:

/*16*/ Czlonek_2_Rzekl_Potem #=(Czlonek_3_Rzekl #= 0), /*17*/ pojedyncze_stwierdzenie(Czlonek_2,

% Opozycyjny_etosowiec zawsze mówi prawdę. Pojedyncze

% stwierdzenie tajnego_wspolpracownika może

% być prawdą lub nieprawdą:

/*27*/ pojedyncze_stwierdzenie(Czlonek, Prawda) :-/*28*/ (Czlonek &= opozycyjny_etosowiec) => Prawda.

% Proszę to sprawdzić w programie 3_12_test_TW_OE.ecl.

% Tajny_wspolpracownik na przemian kłamie i mówi prawdę.

% Opozycyjny_etosowiec zawsze (kolejno) mówi prawdę:

/*29*/ kolejne_stwierdzenia(Czlonek, Prawda1, Prawda2)

:-/*30*/ (Czlonek &= tajny_wspolpracownik) #= (Prawda1 #\= Prawda2).

% Proszę to sprawdzić w programie test_TW_OE.ecl.

Program generuje następujący komunikat:

Również dla tego (stosunkowo skomplikowanego) problemu uzyskano rozwiąza-nie tylko na drodze propagacji.

Aby lepiej zrozumieć program 3_5_black_and_white.ecl, dobrze jest prze-śledzić poniższy pomocniczy program 3_6_test_TW_OE.ecl:

/*1*/ :- lib(ic).

/*2*/ :- lib(ic_symbolic).

/*3*/ :-local domain(czlonek(opozycyjny_etosowiec, tajny_wspolpracownik)).

/*4*/ top

:-% Kolejno odkomentowujemy jeden i tylko jeden z poniższych warunków.

% Dla każdego odkomentowanego warunku otrzymuje się odpowiedź Yes/No.

/*5*/ pojedyncze_stwierdzenie(opozycyjny_etosowiec, 1). % Yes /*6*/ % pojedyncze_stwierdzenie(opozycyjny_etosowiec, 0). % No /*7*/ % pojedyncze_stwierdzenie(tajny_wspolpracownik, 0). % Yes /*8*/ % pojedyncze_stwierdzenie(tajny_wspolpracownik, 1). % Yes /*9*/ % kolejne_stwierdzenia(opozycyjny_etosowiec, 1, 0). % No /*10*/ % kolejne_stwierdzenia(opozycyjny_etosowiec, 1, 1). % Yes /*11*/ % kolejne_stwierdzenia(opozycyjny_etosowiec, 0, 1). % No /*12*/ % kolejne_stwierdzenia(tajny_wspolpracownik, 1, 0). % Yes /*13*/ % kolejne_stwierdzenia(tajny_wspolpracownik, 0, 0). % No /*14*/ % kolejne_stwierdzenia(tajny_wspolpracownik, 0, 1). % Yes /*15*/ % kolejne_stwierdzenia(tajny_wspolpracownik, 1, 1). % No

% Opozycyjny_etosowiec zawsze mówi prawdę. Pojedyncze stwierdzenie

% tajnego_wspolpracownika może być prawdą lub nieprawdą:

/*16*/ pojedyncze_stwierdzenie(Czlonek, Prawda) :-/*17*/ (Czlonek &= opozycyjny_etosowiec) => Prawda.

% Tajny_wspolpracownik na przemian kłamie i mówi prawdę.

% Opozycyjny_etosowiec zawsze (kolejno) mówi prawdę:

/*18*/ kolejne_stwierdzenia(Czlonek, Prawda1, Prawda2)

:-/*19*/ (Czlonek &= tajny_wspolpracownik) #= (Prawda1 #\= Prawda2).

Dla odkomentowanego warunku /*5*/ otrzymuje się odpowiedź: Yes.

Celem przykładów z rozdziału 3.6 było pokazanie, że aczkolwiek algorytmy zgodnościowe nie są kompletne, w pewnych przypadkach mogą same umożli-wić wyznaczenie rozwiązania. Oczywiście, zastosowanie dla tych przypadków poszukiwań (tzn. wprowadzenie predykatu labeling/1) nigdy nie przeszkadza w wyznaczeniu rozwiązania, a najczęściej przyśpiesza wyznaczenie rozwiązania.

Powiązane dokumenty