Exemplo n.º 1
0
        public DFA make_FA_from_partition(List <List <State> > l)
        {
            List <State> fa = new List <State>();

            for (int i = 0; i < l.Count; i++)
            {
                State temp = new State("q" + i);
                if (l[i][0].isFinal)
                {
                    temp.isFinal = true;
                }
                foreach (var j in l[i])
                {
                    if (j.isInit)
                    {
                        temp.isInit = true;
                    }
                }
                fa.Add(temp);
            }
            List <DeletableTransition> value = new List <DeletableTransition>();

            for (int i = 0; i < l.Count; i++)
            {
                for (int z = 0; z < State.alphabets.Count; z++)
                {
                    if (l[i][0].DTransitions.TryGetValue(State.alphabets[z], out value))
                    {
                        for (int j = 0; j < l.Count; j++)
                        {
                            for (int t = 0; t < l[j].Count; t++)
                            {
                                if (l[j][t].name == value[0].State.name)
                                {
                                    DeletableTransition temp = new DeletableTransition(new State(fa[j].name));
                                    fa[i].DTransitions.Add(State.alphabets[z], new List <DeletableTransition>()
                                    {
                                        temp
                                    });
                                }
                            }
                        }
                    }
                }
            }
            State initial = fa[0];;

            for (int i = 0; i < fa.Count; i++)
            {
                if (fa[i].isInit)
                {
                    initial = fa[i];
                }
            }

            return(new DFA(initial, fa));
        }
Exemplo n.º 2
0
        public State Merge(State s, NFA TempNfa)
        {
            State merged = new State(this.name + s.name);
            DeletableTransition MERGED = new DeletableTransition(merged);

            if (this.isInit || s.isInit)
            {
                merged.isInit = true;
            }
            if (this.isFinal || s.isFinal)
            {
                merged.isFinal = true;
            }
            if (this.DTransitions.TryGetValue("", out List <DeletableTransition> value))
            {
                for (int i = 0; i < value.Count; i++)
                {
                    if (value[i].State.name == s.name || value[i].State.name == this.name)
                    {
                        value.RemoveAt(i);
                    }
                }
            }
            if (s.DTransitions.TryGetValue("", out List <DeletableTransition> value1))
            {
                for (int i = 0; i < value1.Count; i++)
                {
                    if (value1[i].State.name == this.name || value1[i].State.name == s.name)
                    {
                        value.RemoveAt(i);
                    }
                }
            }
            for (int i = 0; i < State.alphabets.Count; i++)
            {
                List <DeletableTransition> temp = new List <DeletableTransition>();
                if (this.DTransitions.TryGetValue(State.alphabets[i], out value))
                {
                    for (int j = 0; j < value.Count; j++)
                    {
                        if (value[j].State.name == this.name || value[j].State.name == s.name)
                        {
                            temp.Add(MERGED);
                        }
                        else
                        {
                            temp.Add(value[j]);
                        }
                    }
                }
                if (s.DTransitions.TryGetValue(State.alphabets[i], out value1))
                {
                    for (int j = 0; j < value1.Count; j++)
                    {
                        if (value1[j].State.name == this.name || value1[j].State.name == s.name)
                        {
                            temp.Add(MERGED);
                        }
                        else
                        {
                            temp.Add(value1[j]);
                        }
                    }
                }
                merged.DTransitions.Add(State.alphabets[i], temp);
            }

            for (int i = 0; i < TempNfa.States.Count; i++)
            {
                for (int j = 0; j < State.alphabets.Count; j++)
                {
                    if (TempNfa.States[i].DTransitions.TryGetValue(State.alphabets[j], out value))
                    {
                        for (int t = 0; t < value.Count; t++)
                        {
                            if (value[t].State.name == this.name || value[t].State.name == s.name)
                            {
                                value.RemoveAt(t);
                                value.Add(MERGED);
                            }
                        }
                    }
                }
            }

            return(merged);
        }
Exemplo n.º 3
0
        public DFA CreateEquivalentDFA()
        {
            NFA TEMP = this.RemoveLambda();
            List <ConvertionalState> table = new List <ConvertionalState>();
            State trap = new State("trap");

            TEMP.States.Add(trap);
            ConvertionalState Trap = new ConvertionalState(new List <State>()
            {
                trap
            });

            for (int i = 0; i < State.alphabets.Count; i++)
            {
                Trap.DTransitions.Add(State.alphabets[i], trap.name);
            }
            List <State> name = new List <State>()
            {
                TEMP.initialState
            };

            table.Add(new ConvertionalState(name, true));
            for (int i = 0; i < table.Count; i++)
            {
                for (int j = 0; j < State.alphabets.Count; j++)
                {
                    List <State> transition = new List <State>();
                    for (int t = 0; t < table[i].name.Count; t++)
                    {
                        if (table[i].name[t].DTransitions.TryGetValue(State.alphabets[j], out List <DeletableTransition> value))
                        {
                            for (int z = 0; z < value.Count; z++)
                            {
                                bool Its_new = true;
                                for (int x = 0; x < transition.Count; x++)
                                {
                                    if (value[z].State.name == transition[x].name)
                                    {
                                        Its_new = false;
                                    }
                                }
                                if (Its_new)
                                {
                                    transition.Add(value[z].State);
                                }
                            }
                        }
                    }
                    if (transition.Count == 0)
                    {
                        table[i].DTransitions.Add(State.alphabets[j], trap.name);
                    }
                    else
                    {
                        string Name = "";
                        for (int t = 0; t < transition.Count; t++)
                        {
                            Name += transition[t].name;
                        }
                        table[i].DTransitions.Add(State.alphabets[j], Name);
                    }
                    bool   flag  = false;
                    string Value = "";
                    if (table[i].DTransitions.TryGetValue(State.alphabets[j], out Value))
                    {
                        if (Value.Length != 0)
                        {
                            for (int t = 0; t < table.Count; t++)
                            {
                                string      tempname = "";
                                List <char> c        = new List <char>();
                                for (int z = 0; z < table[t].name.Count; z++)
                                {
                                    tempname += table[t].name[z].name;
                                }
                                for (int z = 0; z < tempname.Length; z++)
                                {
                                    c.Add(tempname[z]);
                                }

                                for (int z = 0; z < c.Count; z++)
                                {
                                    for (int x = z; x < c.Count; x++)
                                    {
                                        if (c[z] < c[x])
                                        {
                                            char s = c[z];
                                            c[z] = c[x];
                                            c[x] = s;
                                        }
                                    }
                                }
                                tempname = "";
                                for (int z = 0; z < c.Count; z++)
                                {
                                    tempname += c[z];
                                }

                                c = new List <char>();
                                for (int z = 0; z < Value.Length; z++)
                                {
                                    c.Add(Value[z]);
                                }
                                for (int z = 0; z < c.Count; z++)
                                {
                                    for (int x = z; x < c.Count; x++)
                                    {
                                        if (c[z] < c[x])
                                        {
                                            char s = c[z];
                                            c[z] = c[x];
                                            c[x] = s;
                                        }
                                    }
                                }
                                Value = "";
                                for (int z = 0; z < c.Count; z++)
                                {
                                    Value += c[z];
                                }

                                if (tempname == Value)
                                {
                                    flag = true;
                                    break;
                                }
                            }
                        }
                    }

                    if (!flag && transition.Count != 0)
                    {
                        table.Add(new ConvertionalState(transition));
                    }
                }
            }
            List <State> dfa = new List <State>();

            for (int i = 0; i < table.Count; i++)
            {
                bool   finalSt = false;
                string NAME    = "";
                for (int j = 0; j < table[i].name.Count; j++)
                {
                    NAME += table[i].name[j].name;
                    if (table[i].name[j].isFinal)
                    {
                        finalSt = true;
                    }
                }
                if (i == 0)
                {
                    dfa.Add(new State(NAME, true));
                }
                else
                {
                    dfa.Add(new State(NAME));
                }
                dfa[dfa.Count - 1].isFinal = finalSt;
            }

            for (int i = 0; i < table.Count; i++)
            {
                for (int j = 0; j < State.alphabets.Count; j++)
                {
                    for (int t = 0; t < dfa.Count; t++)
                    {
                        if (table[i].DTransitions.TryGetValue(State.alphabets[j], out string value))
                        {
                            if (dfa[t].name == value)
                            {
                                DeletableTransition tempp = new DeletableTransition(dfa[t]);
                                dfa[i].DTransitions.Add(State.alphabets[j], new List <DeletableTransition>()
                                {
                                    tempp
                                });
                            }
                        }
                    }
                }
            }


            DFA ReDfa = new DFA(dfa[0], dfa);

            for (int i = 0; i < ReDfa.States.Count; i++)
            {
                for (int j = 0; j < State.alphabets.Count - 1; j++)
                {
                    if (!ReDfa.States[i].DTransitions.TryGetValue(State.alphabets[j], out List <DeletableTransition> value))
                    {
                        DeletableTransition tempp = new DeletableTransition(trap);
                        ReDfa.States[i].DTransitions.Add(State.alphabets[j], new List <DeletableTransition> {
                            tempp
                        });
                    }
                }
            }
            return(ReDfa);
        }