#include "abbas_roth_header.h"

bool valider_fait(int F, bool faits[], regles &reg)     //fonction de validation d'un fait retournant vrai ou faux
{
    bool vregle=false;                  //vregle représente une règle validée ou non
    if (faits[F])
    {return true;}                  //si le fait est déjà valide (faits[F]==true) alors valider_fait retourne vrai
    else{
         int i=0;
         while (!vregle && i<reg.t_reg) //tand que la règle n'est pas valide et qu'il reste une regle à appliquer
         {
            if (reg.tab_reg[i]->ccl-'A'==F)         //pour les regles ayant F comme conclusion
            {
             afficher_init(faits);                  //affichage des faits initiaux
             cout<<"On essaye d'appliquer\t";
             afficher_regle(reg.tab_reg[i]);        //affichage de la règle etudiée
             cout<<endl<<endl;;
             vregle=declencher_regle(i,F,faits,reg);    //fonction récursive de test si la règle est déclenchable
            }
            i++;
        }
    }
    return vregle;
}



bool declencher_regle(int regle_a_appliquer, int F, bool faits[], regles &reg)
{                                                  //fonction récursive de test si la règle est déclenchable
    bool cond=true;         //condition permettant de detecter si une ou plusieurs conditions sont non-remplies
    int i=0;

    while (cond && i<reg.tab_reg[regle_a_appliquer]->t_cond)
    {// tant que cond est vrai (toutes les conditions analysées jusqu'à présent sont remplies) et qu'il reste des contitions à analyser
        cond= valider_fait(reg.tab_reg[regle_a_appliquer]->tab_cond[i]-'A' ,faits,reg) && cond; //la condition est elle remplie?
        i++;
    }

    if (cond)           //si toutes les conditions de la règle sont remplies
    {
        faits[reg.tab_reg[regle_a_appliquer]->ccl-'A']=true;        //on met à jour le fait validé à vrai
    }

    return cond;
}
