next up previous contents index
Weiter: 13 Mehrfachvererbung in Hinauf: 12.4 Ein allgemeines Zurück: 12.4.3 Ein Standard-Beispiel

12.4.4 Ein Fuzzy-Beispiel

Als erstes schaffen wir eine geeignete Fuzzy-Logik.

with Fuzzy_Boolean, Defs;

package My_Fuzzy_Boolean is new Fuzzy_Boolean(Defs.fuzzy_real);

Als nächstes generieren wir eine passende Fuzzy-Menge.

with My_Fuzzy_Boolean, General_Set, Defs;

package Fuzzy_Set is new General_Set(Defs.real,My_Fuzzy_Boolean.fuzzy_bool);

Die generische Funktion Triangle erlaubt uns, später die für Fuzzy-Mengen typischen dreiecksförmigen Verteilungen der Membership-Funktionen zu bilden (vgl. Abb. 12.1).

  figure7744
Abbildung: Eine dreiecksförmige Verteilung einer Membership-Funktion 

with Fuzzy_Boolean;
generic
type real is digits <>;
l,m,u: real;
type fuzzy_real is digits <>;
with package This_Fuzzy_Boolean is new Fuzzy_Boolean(fuzzy_real);
function Triangle(I: real)
return This_Fuzzy_Boolean.fuzzy_bool'CLASS;

function Triangle(I: real)
return This_Fuzzy_Boolean.fuzzy_bool'CLASS
is
begin
if Il or else Iu then
return This_Fuzzy_Boolean.zero;
elsif I=m then
return This_Fuzzy_Boolean.one;
elsif I>l and I<m then
return This_Fuzzy_Boolean.Convert(
fuzzy_real((I-l)/(m-l)));
else -I>mandI<uthen
return This_Fuzzy_Boolean.Convert(
fuzzy_real((I-u)/(m-u)));
end if;
end Triangle;

Solche Instanzen finden wir in

with Triangle, My_Fuzzy_Boolean, Defs;

function Triangle_1 is new Triangle(
Defs.real,0.0,1.0,2.0,Defs.fuzzy_real,My_Fuzzy_Boolean);

with Triangle, Defs, My_Fuzzy_Boolean;

function Triangle_2 is new Triangle(
Defs.real,1.0,2.0,3.0,Defs.fuzzy_real,My_Fuzzy_Boolean);

In der Prozedur main_fuzzy werden diese Mengen entsprechend weiterbehandelt.

with Defs, Triangle, My_Fuzzy_Boolean, Fuzzy_Set, Ada.Text_IO, Triangle_1, Triangle_2;

procedure main_fuzzy
is
tr_1_ptr: Fuzzy_Set.Member_Function_Pointer := Triangle_1'Access;
tr_2_ptr: Fuzzy_Set.Member_Function_Pointer := Triangle_2'Access;

my_set_1, my_set_2, my_set_3: Fuzzy_Set.set;

package Real_IO is new Ada.Text_IO.Float_IO(Defs.fuzzy_real);

begin
my_set_1 :=
Fuzzy_Set.Create(
Member_Function => tr_1_ptr);

my_set_2 :=
Fuzzy_Set.Create(
Member_Function => tr_2_ptr);

my_set_3 := Fuzzy_Set.Union(my_set_1, my_set_2);

Real_IO.Put(My_Fuzzy_Boolean.Convert(Fuzzy_Set.Is_Member(1.5, my_set_3)));

end main_fuzzy;



Johann Blieberger
Wed Feb 11 09:58:52 MET 1998