next up previous contents index
Weiter: 12.4.3 Ein Standard-Beispiel Hinauf: 12.4 Ein allgemeines Zurück: 12.4.1 Die Standard-Logik

12.4.2 Die Fuzzy-Logik

Fuzzy-Logik läßt sich wie folgt aus unserem allgemeinen Paket ableiten:

with General_Boolean;

generic
type fuzzy_float is digits <>;
package Fuzzy_Boolean is

type fuzzy_bool is new General_Boolean.gen_bool with private;

zero: constant fuzzy_bool;
one: constant fuzzy_bool;

function Convert(float: fuzzy_float) return fuzzy_bool;
function Convert(fuzzy: fuzzy_bool) return fuzzy_float;

function "and"(left,right: fuzzy_bool) return fuzzy_bool;
function "or" (left,right: fuzzy_bool) return fuzzy_bool;
function "not"(val: fuzzy_bool) return fuzzy_bool;

private

type fuzzy_bool is new General_Boolean.gen_bool with
record
f: fuzzy_float;
end record;

zero: constant fuzzy_bool := (General_Boolean.gen_bool with 0.0);
one: constant fuzzy_bool := (General_Boolean.gen_bool with 1.0);

end Fuzzy_Boolean;

Diesmal haben wir ein generisches Paket vorliegen, deren Parameter den rellen Typ der Fuzzy-Logik einstellbar gestaltet. Zusätzlich wurden Konstanten für zero und one deklariert.

package body Fuzzy_Boolean is

function Convert(float: fuzzy_float) return fuzzy_bool
is
begin
return (General_Boolean.gen_bool with float);
end Convert;

function Convert(fuzzy: fuzzy_bool) return fuzzy_float
is
begin
return fuzzy.f;
end Convert;

function "and"(left,right: fuzzy_bool) return fuzzy_bool
is
h: fuzzy_bool;
begin
h.f := left.f right.f;
return h;
end "and";

function "or" (left,right: fuzzy_bool) return fuzzy_bool
is
h: fuzzy_bool;
begin
h.f := 1.0 - (1.0 - left.f) (1.0 - right.f);
return h;
end "or";

function "not"(val: fuzzy_bool) return fuzzy_bool
is
h: fuzzy_bool;
begin
h.f := 1.0 - val.f;
return h;
end "not";

begin
if fuzzy_float'First 0.0 or else fuzzy_float'Last 1.0 then
raise constraint_error;
end if;
end Fuzzy_Boolean;

In der Implementierung wurde für ,,und`` die Multiplikation der beiden Operanden gewählt. Man könnte natürlich auch das Minimum der beiden Operanden wählen oder gar einen Typ schaffen, wo die Operationen ,,and`` und ,,or`` abstrakt sind, und dann etwa in Kindpaketen die beiden unterschiedlichen Realisierungsmöglichkeiten implementieren.

Da bei der Definition des generischen Parameters für den reellen Typ der Fuzzy-Logik syntaktisch nicht berücksichtigt werden kann, daß der reelle Typ nur Werte zwischen 0.0 und 1.0 annehmen kann, geschieht diese Überprüfung im Paket-Body zum Zeitpunkt der Instantiierung.



next up previous contents index
Weiter: 12.4.3 Ein Standard-Beispiel Hinauf: 12.4 Ein allgemeines Zurück: 12.4.1 Die Standard-Logik

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