⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 turing-m.cpp

📁 The program simulates a Nondeterministic Multitape Turing Machine. It works as ordinary (Determinist
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// =========
Transitions_t::const_iterator NondeterministicTuringMachine::get_processed_transition() const
{
  assert (!cur_status_.empty());

size_t id;
const bool rc = get_next_id_to_be_processed (id);
  assert (rc);
  assert (id < cur_status_.size());

  return cur_status_[id].the_transition_;
}



// =========
int& NondeterministicTuringMachine::get_cur_transition_subno()
{
  assert (!cur_status_.empty());
  return cur_status_.back().the_transition_subno_;
}



// =========
int NondeterministicTuringMachine::get_processed_transition_subno() const
{
  assert (!cur_status_.empty());

size_t id;
const bool rc = get_next_id_to_be_processed (id);
  assert (rc);
  assert (id < cur_status_.size());

  return cur_status_[id].the_transition_subno_;
}



// =========
vector<int> NondeterministicTuringMachine::get_cur_branch() const
{
  assert (!cur_status_.empty());
  return cur_status_.back().the_branch_;
}



// =========
vector<int> NondeterministicTuringMachine::get_processed_branch() const
{
  assert (!cur_status_.empty());

size_t id;
const bool rc = get_next_id_to_be_processed (id);
  assert (rc);
  assert (id < cur_status_.size());

  return cur_status_[id].the_branch_;
}



// =========
string NondeterministicTuringMachine::getstr_cur_branch() const
{
  assert (!cur_status_.empty());
vector<int> branch (get_cur_branch());
ostringstream oss;
  copy (branch.begin(), branch.end(), ostream_iterator<int> (oss, "-"));

const string str (oss.str());
  return str.substr (0, str.size() - 1); 
}



// =========
string NondeterministicTuringMachine::getstr_processed_branch() const
{
  assert (!cur_status_.empty());
vector<int> branch (get_processed_branch());
ostringstream oss;
  copy (branch.begin(), branch.end(), ostream_iterator<int> (oss, "-"));

const string str (oss.str());
  return str.substr (0, str.size() - 1); 
}




// =========
bool NondeterministicTuringMachine::get_next_id_to_be_processed (size_t& id_o) const
{
  assert (!cur_status_.empty());
  id_o = MachineStatus::next_id_to_be_processed_s;
  return (MachineStatus::next_id_to_be_processed_s < cur_status_.size());
}


// =========
// =========
bool NondeterministicTuringMachine::perform_step (
		const state_t& state_i, 
		const vector<symbol_t>& scanned_symbols_i, 
		Transitions_t::const_iterator& find_iter_o,
		const string& msg_i
		)
{
  IF_NOT_EMPTY (msg_i, 5, '=');

  assert (state_i != symbol_t());

find_iter_o = transitions_.find (CurSituation(state_i, scanned_symbols_i));

  if (find_iter_o == transitions_.end())	
  {
    assert (state_i != symbol_t());
    return false;
  }

size_t dist = distance (transitions_.begin(), find_iter_o);
  assert (dist < transitions_.size());
  transition_statistics_[dist]++;

  // -----------------------
  // -----------------------
const Tapes_t last_tapes (get_processed_tapes());
const vector<int> last_branch (get_processed_branch());

const size_t next_configuration_no = get_cur_configuration () + 1;

  for (size_t id = 0; id < find_iter_o->second.size(); id++)
  {
    const int subno = id + 1;
    cur_status_.push_back (MachineStatus());

    cur_status_.back().the_branch_ = last_branch;
    cur_status_.back().the_branch_.push_back(subno);
    time_used_ = MAX_VALUE (time_used_, cur_status_.back().the_branch_.size());

    get_cur_configuration() = next_configuration_no;

    Tapes_t::iterator pos_iter;
    for (pos_iter = get_cur_tapes().begin(); pos_iter != get_cur_tapes().end(); pos_iter++)
    {
      pos_iter->second.clear_it();
    }
    get_cur_tapes().clear();

    get_cur_tapes() = last_tapes;
    // -----------------------

    get_cur_transition() = find_iter_o;
    get_cur_transition_subno() = subno;
    get_cur_state() = find_iter_o->second[id].get_state ();
    for (size_t i = 0; i < get_cur_tapes().size(); i++)
    {
      get_cur_tapes()[i].set_symbol (find_iter_o->second[id].get_symbol (i));
      get_cur_tapes()[i].shift_position (find_iter_o->second[id].get_shift(i));
    }
 
    assert (get_cur_state() != symbol_t());
  }

  MachineStatus::next_id_to_be_processed_s++;

  return true;

}

// =========
bool NondeterministicTuringMachine::process_input (
		const vector<vector<symbol_t> >& input_words_i,
		const string& msg_i
		)
{
  IF_NOT_EMPTY (msg_i, 5, '=');

  if (!check_results_)
  {
    FATAL_MSG	("Invalid Nondeterministic Turing Machine definition");
    return false;
  }

vector<vector<symbol_t> > input_words (input_words_i);
vector<long> init_pos;

  cout << endl;
  if (!check_input_words(input_words, init_pos))
  {
    show_input (input_words, init_pos, false);
    FATAL_MSG	("Invalid input words");
    cur_input_set_no_++;
    return false;
  }
  clear_it ();
  assert (input_words.size() == init_pos.size());
  show_input (input_words, init_pos);
  set_input (input_words, init_pos);


  // ------------------
state_t	 state;
vector<symbol_t>	scanned_symbols;

bool	ret_bool_value;

  cout << endl;
  cout << endl;
  cout << "\t"
       << string (5, '#') 
       << " "
       << getstr_id_info ()
       << "Processing"
       << " "
       << string (5, '#') 
       << endl;

Transitions_t::const_iterator find_iter = transitions_.end();

size_t next_id;

  for (int step_no = 0; ; step_no++)
  {

    const int actual_step_no = step_no;
    if (!get_next_id_to_be_processed (next_id)) break;
    assert (next_id < cur_status_.size());

    scanned_symbols.clear();
    for (size_t i = 0; i < cur_status_[next_id].the_tapes_.size(); i++)
    {
      scanned_symbols.push_back(cur_status_[next_id].the_tapes_[i].get_scanned_symbol ());
    }

    // -------------------------------------
    show2_situation (getstr_id_info (), actual_step_no);
    ret_bool_value = perform_step (cur_status_[next_id].the_state_, scanned_symbols, find_iter);  

    state = get_processed_state();

    // -------------------
    show1_situation (find_iter);
    assert (((find_iter != transitions_.end()) && (ret_bool_value)) || ((find_iter == transitions_.end()) && (!ret_bool_value)));
    if (!ret_bool_value)
    { 
      cout << "\t" << getstr_id_info () << "Failure" << (is_actually_nondeterministic_ ? " of the Branch" : "") << endl;
      cout << "\t" << "  1) There exists no appropriate rule for" << endl;
      cout << "\t" << "     " << state << " [ ";
      copy (scanned_symbols.begin(), scanned_symbols.end(), ostream_iterator<string> (cout, " "));
      cout << "]" << endl;
      cout << "\t" << "  2) Current state (" << state << ") is not halting one" << endl;

      cout << endl;
      cout << endl;

      MachineStatus::next_id_to_be_processed_s++;
      continue;
    }

    assert (ret_bool_value);
    // -------------------
    // show2_situation (getstr_id_info (), "Configuration#" + to_string (actual_step_no));

    // -------------------
    if (is_halting_state (state))
    {
      show2_situation (getstr_id_info (), actual_step_no + 1);

      cout << "\t" << getstr_id_info () << "Success : Current state (" << state << ") is halting one" << endl;
      cout << endl;
      cout << endl;

      MachineStatus::next_id_to_be_processed_s++;
      break;
    }

  } // for (step_no = 

const size_t the2_setw = 3;

ostringstream oss;
  oss << "" 
       << string (the2_setw, '-')
       << " "
       << getstr_id_info (true)
       << " Result : Input word(s) " 
       << (ret_bool_value ? "ACCEPTED" : "REJECTED") 
       << " " 
       << string (the2_setw, '-'); 
  
const size_t the1_setw = oss.str().size();

const string prefix (3, ' ');

  cout << endl;
  cout << prefix << string (the1_setw, '-') << endl;
  cout << prefix 
       << oss.str()
       << endl;
  cout << prefix << string (the1_setw, '-') << endl;
  cout <<  endl;

  // -----------------------------
  assert (output_size_ == 0);
  output_size_ = get_output_size();

  assert (space_used_ == 0);
  space_used_ = get_space_used();

  show_resources_report ();

  // -----------------------------
  show_statistics ();

  return ret_bool_value;
}


// =========
void NondeterministicTuringMachine::show_env () const
{
  cout << endl;
  cout << "\t###### Nondeterministic Turing Machine Definition ######" << endl;
  if (is_actually_nondeterministic_)
  {
    cout << "\t###### This Machine is actually Nondeterministic  ######" << endl;
  }
  else
  {
    cout << "\t###### This Machine is actually Deterministic!!!  ######" << endl;
  }

  cout << endl;
  show_descr ();

  cout << endl;
  cout << endl;
  show_states ();

  cout << endl;
  cout << endl;
  show_alphabets();

  cout << endl;
  cout << endl;
  show_transition ();

}


// =========
void NondeterministicTuringMachine::show_descr (const string& msg_i) const
{
  cout << "\t   ====== Description ======" << endl;

  IF_NOT_EMPTY (msg_i, 5, '=');

  if (descr_.empty())
  {
    cout << "No description" << endl;
  }

  for (size_t i = 0; i < descr_.size(); i++)
  {
    copy (descr_[i].begin(), descr_[i].end(), ostream_iterator<string> (cout, " "));
    cout << endl;
  }

}


// =========
void NondeterministicTuringMachine::show_states (const string& msg_i) const
{
  cout << "\t   ====== States Definition ======" << endl;

  IF_NOT_EMPTY (msg_i, 5, '=');


string text_initial_states ("Initial states");
string text_halting_states ("Halting states");
string text_internal_states ("Internal states");
size_t text_max_size = 0;

  text_max_size	= MAX_VALUE(text_max_size, text_initial_states.size());
  text_max_size	= MAX_VALUE(text_max_size, text_halting_states.size());
  text_max_size	= MAX_VALUE(text_max_size, text_internal_states.size());


  cout << setw(text_max_size) << left << text_initial_states.c_str() << " : ";
  for (size_t i = 0; i < initial_states_.size(); i++)
  {
    cout << setw (max_state_size_) << initial_states_[i].c_str() << " ";
  }
  cout << endl;

  cout << setw(text_max_size) << left << text_halting_states.c_str() << " : ";
  for (size_t i = 0; i < halting_states_.size(); i++)
  {
    cout << setw (max_state_size_) << halting_states_[i].c_str() << " ";
  }
  cout << endl;

  cout << setw(text_max_size) << left << text_internal_states.c_str() << " : ";
  for (size_t i = 0; i < internal_states_.size(); i++)
  {
    cout << setw (max_state_size_) << internal_states_[i].c_str() << " ";
  }
  cout << endl;


}

// =========
void NondeterministicTuringMachine::show_alphabet (const Tapes_t::const_iterator& iter_i) const
{
  iter_i->second.show_alphabet();
}

// =========
void NondeterministicTuringMachine::show_alphabets () const
{
Tapes_t::const_iterator pos_iter;
  cout << "\t   ====== Alphabet Definition ======" << endl;
  for (pos_iter = init_tapes_.begin(); pos_iter != init_tapes_.end(); pos_iter++)
  {
    cout << "\t      ------ Tape# " << distance (init_tapes_.begin(), pos_iter) << " ------" << endl;
    show_alphabet (pos_iter);
    cout << endl;
  }
}

// =========
void NondeterministicTuringMachine::show_transition () const
{
Transitions_t::const_iterator pos_iter;
  cout << "\t   ====== Transition Rules Definition ======" << endl;
  for (pos_iter = transitions_.begin(); pos_iter != transitions_.end(); pos_iter++)
  {
    cout << getstr_rule_S (
		is_actually_nondeterministic_, 
		transitions_.begin(), 
		pos_iter, 
		max_state_size_, 
		max_symbol_size_
		);
  }
  cout << endl;
}

// =========
string NondeterministicTuringMachine::getstr_rule_S (
		bool is_actually_nondeterministic_i,
		Transitions_t::const_iterator iter1_i,
		Transitions_t::const_iterator iter2_i,
		size_t	max_state_size_i,
		size_t	max_symbol_size_i,
		int	subno_i
		)
{
  assert (subno_i != 0);
  assert ((subno_i > 0) || (subno_i == -1));

ostringstream oss;
  for (size_t k = 0; k < iter2_i->second.size(); k++)
  {
    if ((subno_i == -1)	|| (size_t(subno_i) == (k + 1)))
    {
      oss << ""
          << "Rule#"
          << setw (SETW_RULE_NUMBER)
          << right
          << distance (iter1_i, iter2_i);
      if (is_actually_nondeterministic_i)
      {
        oss << "-"
            << (k + 1);
      }
      oss << " :   "
          << setw (max_state_size_i)
          << iter2_i->first.get_state().c_str()
          << " [ " 
          << iter2_i->first.getstr_symbols(max_symbol_size_i)
          << "] ---> "
          << setw (max_state_size_i)
          << iter2_i->second[k].get_state().c_str()
          << " [ " 
          << iter2_i->second[k].getstr_symbols_and_shifts(max_symbol_size_i)
          << "]"
          << endl;
    }
  }

  return oss.str();
}
   
// =========
void NondeterministicTuringMachine::show_tape (const Tapes_t::const_iterator& iter_i) const
{
  iter_i->second.show_tape();
}


// =========
void NondeterministicTuringMachine::show1_situation (
	const Transitions_t::const_iterator& find_iter_i,
	bool init_configuration_i
	) const
{
  assert (!cur_status_.empty());
  assert (!init_configuration_i);

  if (find_iter_i != transitions_.end())
  {
    for (size_t k = 0; k < find_iter_i->second.size(); k++)
    {
      cout << "\t" 
           << getstr_id_info ()
           << "Applied " 
           << getstr_rule_S (
		is_actually_nondeterministic_, 
		transitions_.begin(), 
		find_iter_i, 
		max_state_size_, 
		max_symbol_size_, 
		k + 1
		); 
    }
  }
  else
  {
      cout << "\t" 
           << getstr_id_info ()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -