-
Notifications
You must be signed in to change notification settings - Fork 4
Clause WHERE : intégration de prédicats flous
L’évaluation de la clause WHERE d’une requête SQL s’appuie normalement sur la logique booléenne pour effectuer la sélection des tuples de la relation résultats. Le degré de satisfaction d’un prédicat flou renvoie un nombre réel qui ne correspond pas au booléen habituellement nécessaire pour aboutir à l’évaluation de clause WHERE sans erreur. Afin d’intégrer ces prédicats flous dans la clause WHERE, nous avons envisagé deux stratégies d’évaluation différentes qui reposent sur la conversion entre booléens et nombre flottants.
Pour traiter nativement des nombres flottants dans une clause WHERE, une modification importante de la stratégie d’évaluation est nécessaire. Ces modifications concernent des fonctions natives présentes dans de nombreux fichiers sources C, ce qui limite la maintenance, le développement et la distribution de l’extension SQLf. Par ailleurs, des effets de bords indésirables ont été observés sur le comportement normal de PostgreSQL.
Un résultat analogue peut être obtenu en utilisant uniquement des opérations définies en PL/PGSQL. Nous pouvons tout d’abord proposer une conversion de valeurs booléennes vers des nombres flottants :
CREATE OR REPLACE FUNCTION bool2fuzzy(BOOLEAN) RETURNS FLOAT LANGUAGE SQL AS 'SELECT $1::int::FLOAT'; CREATE CAST (BOOLEAN AS FLOAT) WITH FUNCTION bool2fuzzy(FLOAT) AS IMPLICIT;
Cette conversion est utilisée par la suite par les opérateurs de conjunction et disjunction OR et AND. Nous définissons également une procédure pour convertir en booléen le degré de satisfaction MU d’un prédicat flou :
CREATE OR REPLACE FUNCTION fuzzy2bool(mu FLOAT) RETURNS boolean LANGUAGE SQL AS 'SELECT set_mu(mu);SELECT mu > get_alpha()';
Cette conversion est appliquée implicitement par un opérateur de CAST, juste avant l’évaluation d’un prédicat flou terminal dans la clause WHERE :
CREATE CAST (real AS boolean) WITH FUNCTION fuzzy2bool(real) AS IMPLICIT;
Pour des besoins ultérieurs, la valeur réelle associée au prédicat MU est stockée dans une variable à l’aide de la fonction set_mu(real).