public bool Response(Goal goal)
 {
     return(true);
 }
        public bool Demo(TP2_AI.Form1 form, Goal goal, List <Fact> facts, List <Rule> rules, bool save_trace, bool first_time)
        {
            if (first_time)
            {
                file           = new StreamWriter(@"" + Path.GetDirectoryName(form.Bc_path) + "/TRACE.txt", !first_time);
                file.AutoFlush = true;
            }

            bool butDemontre = false;

            if (butDemontre = SearchGoal(goal, facts))
            {
                return(butDemontre);
            }
            else
            {
                Tuple <bool, List <Rule> > t = DeductableGoal(form, goal, facts, rules, save_trace, file);
                form.updateText("----------------------------------------");
                while (!butDemontre && t.Item1)
                {
                    foreach (Rule r in t.Item2)
                    {
                        butDemontre = Verif(form, r, facts, rules, save_trace, file);
                        if (butDemontre)
                        {
                            cleanList(facts); // on elimine les duplications: erreure due à la structure des données et la récursivité
                            if (save_trace)
                            {
                                file.WriteLine("before adding a new fact");
                            }
                            form.updateText("before adding a new fact");
                            string fc = null;
                            foreach (Fact f in facts)
                            {
                                fc += f.Name + "|" + f.Negated + "|| ";
                            }
                            form.updateText(fc);
                            if (save_trace)
                            {
                                file.WriteLine(fc);
                            }

                            string cc = null;
                            foreach (Conclusion c in r.GetConclusion())
                            {
                                cc += "Added new fact: " + c.Name + " nagetion: " + c.Negated + Environment.NewLine;
                                facts.Add(new Fact(r.Number, c.Name, c.Negated));
                            }
                            form.updateText(cc);
                            if (save_trace)
                            {
                                file.WriteLine(cc);
                            }
                            form.updateText("new facts base");
                            if (save_trace)
                            {
                                file.WriteLine("new facts base");
                            }

                            fc = null;
                            foreach (Fact f in facts)
                            {
                                fc += f.Name + "|" + f.Negated + "|| ";
                            }
                            form.updateText(fc);
                            if (save_trace)
                            {
                                file.WriteLine(fc);
                            }
                            goto Flag2;
                        }
                    }
                    form.updateText("Reseting deducting rules List");
                    if (save_trace)
                    {
                        file.WriteLine("Reseting deducting rules list");
                    }

                    t = DeductableGoal(form, goal, facts, rules, save_trace, file);
                }
                if (!butDemontre & goal.Demandable == true)
                {
                    form.updateText("I asked you a question");
                    if (save_trace)
                    {
                        file.WriteLine("Iasked you a question");
                    }
                    AskQuestion(goal);
                    butDemontre = Response(goal);
                }
            }
Flag2:
            if (butDemontre)
            {
                facts.Add(new Fact(0, goal.Name, goal.Negated));
            }
            return(butDemontre);
        }
 public void AskQuestion(Goal goal)
 {
     // console shit;
 }
        public string ForwardChainingWithConflict(TP2_AI.Form1 form, List <Rule> rules, List <Fact> facts, Goal goal, bool saturate, bool save_trace)
        {
            StreamWriter file = new StreamWriter(@"" + Path.GetDirectoryName(form.Bc_path) + "/TRACE.txt");

            file.AutoFlush = true;
            bool        goal_reached = false;
            bool        error        = false; //on suppose qu'il y aura pas d'erreur jusqu'à la présence du cas
            string      result       = String.Empty;
            List <Rule> BRF          = new List <Rule>();

            while ((BRF = Filtrage(rules, facts)).Count != 0)
            {
                if (saturate) //chainage avant en largeur
                {
                    foreach (Rule rule in BRF)
                    {
                        List <Conclusion> c = rule.GetConclusion();
                        foreach (Conclusion c_ in c)
                        {
                            if (SearchError(c_, facts))
                            {
                                error = true;
                            }
                            if (error)
                            {
                                goto error;
                            }
                            facts.Add(new Fact(rule.Number, c_.Name, c_.Negated));
                        }
                        rule.Used = true;
                        form.updateText("Rule: " + rule.Number + " used");
                        if (save_trace)
                        {
                            file.Write(rule.Number + " | ");
                        }
                    }
                    if (save_trace)
                    {
                        file.WriteLine();
                    }
                    string f = null;
                    foreach (Fact fact in facts)
                    {
                        f += "[" + fact.Name + " Négation: " + fact.Negated + "] ";
                        if (save_trace)
                        {
                            file.Write("[" + fact.Name + " Négation: " + fact.Negated + "] ");
                        }
                    }
                    form.updateText(f);
                    if (save_trace)
                    {
                        file.WriteLine();
                    }
                }
                else // Chainage avant en profendeur avec conflit
                {
                    Rule rule           = BRF.First <Rule>(); // choix règle FIFO
                    List <Conclusion> c = rule.GetConclusion(); // on extrait la conclusion de la régle
                    foreach (Conclusion c_ in c)
                    {
                        if (SearchError(c_, facts))
                        {
                            error = true;
                        }
                        if (error)
                        {
                            goto error;        // on specifie qu'il y'avait une erreur
                        }
                        facts.Add(new Fact(rule.Number, c_.Name, c_.Negated));
                    }
                    form.updateText("Rule " + rule.Number + " used.");
                    if (save_trace)
                    {
                        file.WriteLine("Rule used " + rule.Number);
                    }
                    string f = null;
                    foreach (Fact fact in facts)
                    {
                        f += "[" + fact.Name + "  Négation: " + fact.Negated + "] ";
                        if (save_trace)
                        {
                            file.Write("[" + fact.Name + " Négation: " + fact.Negated + "] ");
                        }
                    }
                    form.updateText(f);
                    if (save_trace)
                    {
                        file.WriteLine();
                    }
                    rule.Used = true;
                    if (SearchGoal(goal, facts))
                    {
                        goal_reached = true;
                        goto foundgoal;
                    }
                }
            }
            if (saturate) // en cas de saturation on cherche la presence du but après avoir déduit tout les régles
            {
                goal_reached = SearchGoal(goal, facts);
            }
foundgoal:  //label
error:      //label
            file.Close();
            if (goal == null)
            {
                return("Deduction des faits términée");
            }
            if (goal_reached)
            {
                result = "Le but est atteint dans la BF";
            }
            else if (error)
            {
                result = "Il y'avait une erreur [ambuguité dans les conclusion des régles et la BF]";
            }
            else if (!goal_reached)
            {
                result = "Le but n'est pas atteint";
            }
            return(result);
        }