請問用C++怎麼寫出finite state machine minimization 的程式?

2021-01-16 2:27 pm
如題,我想打出可以輸入想要的finite state machine(未化簡)數量,還要輸入input和output的數量,和需要列出全部的state,和state table,並且所有輸入和輸出都是從txt檔匯入,請問該怎麼做,如果可以,請告訴我程式碼會比較容易理解

回答 (2)

2021-01-22 7:50 am
An FSM can be defined as a list of state transition rules in the following format:

StateX InputY OutputZ StateA

where
InputY belongs to a finite set of alphabets; and
StateX StateA belong to a finite set of states; and
There is no duplicate rules with the same <StateX, InputY>

#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
#include<map>
using namespace std;

struct Rule{

  string state;

  string inout;

  Rule(const decltype(state)&s, const decltype(inout)&i):

    state(s),

    inout(i){}

  Rule(){}

  bool operator()(const Rule&a, const Rule&b) const {

    return a.state != b.state

         ? a.state  > b.state

         : a.inout  > b.inout;

  }

};

map<Rule,Rule,Rule> *readFSM(

  string fileName

){

  ifstream ifile(fileName);

  decltype(Rule::state) st0, st1;

  decltype(Rule::inout) in0, out1;

  auto*ret = new map<Rule,Rule,Rule>();

  auto stLen = st0.length(), alLen = in0.length();

  for(

     ; ifile >> st0 >> in0 >> out1 >> st1

     ;){

    Rule r0(st0, in0);

    if(st0.length() > stLen) stLen = st0.length();

    if(in0.length() > alLen) alLen = in0.length();

    if(ret->find(r0) == ret->end()){

      (*ret)[r0] = Rule(st1,out1);

      if(st1 .length() > stLen) stLen = st1.length();

      if(out1.length() > alLen) alLen = out1.length();

    }

  }

  ifile.close();

  if(stLen+alLen >= MinLen) MinLen = stLen+alLen+1;

  return ret;

}

int main(

  int argc,

  char*argv[]

){

  cout << "FSM is defined in file: " << argv[1] << endl;

  cout << "state transition run input is in file: " << argv[2] << endl << endl;

  auto*fsm{readFSM(argv[1])};

  map<decltype(Rule::state), int> stateMap;

  map<decltype(Rule::inout), int> alphaMap;


  for(auto&kk: *fsm){

    if(stateMap.find(kk.first.state) == stateMap.end())

      stateMap[kk.first.state] = 1;

    else

      ++stateMap[kk.first.state];

    if(alphaMap.find(kk.first.inout) == alphaMap.end())

      alphaMap[kk.first.inout] = 1;

    else

      ++alphaMap[kk.first.inout];

  }


  // print states

  cout << "State count: " << stateMap.size() << endl;

  for(auto&ss: stateMap) cout << "State: " << ss.first << " " << ss.second << endl;

  cout << endl;

  // print alphabets

  cout << "Alphabet count: " << alphaMap.size() << endl;

  for(auto&ss: alphaMap) cout << "Alpha: " << ss.first << " " << ss.second << endl;

  cout << endl;


  cout << "State Table" << endl;

  cout << setw(MinLen+2) << "State/input";

  for(auto&x: alphaMap) cout << setw(MinLen+2) << x.first;

  cout << endl;


  for(auto&s: stateMap){

    cout << setw(MinLen+2) << s.first;

    for(auto i: alphaMap){

      auto r0{Rule(s.first, i.first)};

      auto it = fsm->find(r0);

      decltype(r0.state) s0{"<"};

      if(it != fsm->end()) s0 += it->second.inout + "/" + it->second.state;

      s0 += ">";

      cout << setw(MinLen+2) << s0;

    }

    cout<<endl;

  }

  cout << endl;


  ifstream run(argv[2]);

  decltype(Rule::state) st0;

  decltype(Rule::inout) in0;

  cout << "State transitions: " << endl;

  for( run >> st0

     ; run >> in0

     ; ){

     auto it = fsm->find(Rule(st0,in0));

     if(it != fsm->end())

       cout << "@state=" << st0 << " input " << in0 << " output " << it->second.inout

            << " and transit to state " << (st0 = it->second.state) <<  endl;

     else

       cout << "@state=" << st0 << " received bad input " << in0 << ". Action/transition undefined."

            << endl;

  }

 

  cout << endl << endl << "The final state is " << st0 << endl;
  if(fsm) delete fsm, fsm = NULL;
  if(run.is_open())run.close();
  return 0;
}

$ g++ -std=c++11 -Wall -O3 fsm.cpp -o fsm
$ ./fsm FSM.txt RUN.txt
FSM file is
FSM.txtinput file is RUN.txt

State count: 3
State: state0 2
State: state1 1
State: state2 2

Alphabet count: 2
Alpha: a 3
Alpha: b 2

State Table
        State/input               a               b
          state0      <A/state1>      <B/state2>
          state1      <a/state2>              <>
          state2      <X/state2>      <X/state2>

State transitions:
@state=state2 input a output X and transit to state state2
@state=state2 input a output X and transit to state state2
@state=state2 input b output X and transit to state state2
@state=state2 input b output X and transit to state state2
@state=state2 input b output X and transit to state state2
@state=state2 input a output X and transit to state state2
@state=state2 input b output X and transit to state state2
@state=state2 input a output X and transit to state state2
Qstate=state2 received bad input C. Action/transition undefined.
@state=state2 input a output X and transit to state state2

The final state is state2
$


收錄日期: 2021-04-11 23:26:36
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20210116062752AAp1z9s

檢視 Wayback Machine 備份