преобразовать результат trueTable в логическое выражение

Я пытаюсь преобразовать результат таблицы истинности в логическое утверждение. Для тех, кто не в курсе, напишу подробно.

У меня есть вектор строки в формате, как показано ниже. Все элементы строки внутри вектора имеют одинаковую длину. Участники состоят только из - или 0 или 1. например, вектор v содержит 3 члена с длиной 5 для каждого члена.

string vv[] = { "--1-0"  , "-1-1-" ,  "01-1-" };
std::vector<string> v(begin(vv), end(vv));

Каждый символ строки представляет другой элемент вектора «A» вместе с логической операцией. Например,

первый --1-0 это (A[2] && !A[4])

Я хотел бы преобразовать мой вышеуказанный вектор v в

(A[2] && !A[4]) || (A[1] && A[3] ) || (!A[0] && A[1] && A[3])

Что я хочу сделать, так это иметь функцию с векторами v и A в качестве входных данных, а возврат будет выше логического оператора. Я уверен, вы заметили, что 1 — это true, 0 — это Not true, а - — статус «все равно».

РЕДАКТИРОВАТЬ: я НЕ собираюсь решать таблицы правды или Kmap. У меня уже есть результат. Мой результат в формате вектора "v". Я хочу создать связь между V и A с помощью логического оператора.

Любое предложение приветствуется.


person H'H    schedule 18.05.2016    source источник
comment
Каков результат строки ----- true или false?   -  person Vlad from Moscow    schedule 18.05.2016
comment
"-----" ничего. если приходит другая строка, это равносильно объединению ни с чем.   -  person H'H    schedule 18.05.2016
comment
карты Карно со состояниями {true, false, any} в целом могут быть интересны.   -  person Joop Eggen    schedule 18.05.2016
comment
@JoopEggen, я не хочу решать таблицу истинности. Спасибо   -  person H'H    schedule 18.05.2016
comment
Вам нужен оператор (как строка кода) или результат вычисления оператора с вектором логических входных данных? Вы все равно должны сказать, каков базовый случай, если он сказал vv[] = { "-----" , "-----" , "-----" }; Тогда вы не используете никаких входных данных от A. Вы можете отменить его определение (и сказать, что вам все равно, какой результат возврата, поэтому реализация может быть true или false, как удобно), или сказать, что это должна быть ошибка, или иметь специальный возвращаемый результат, который не был ни истинным, ни ложным (возможно, само возвращаемое значение передается с помощью 1 или 0 или - вместо true/false).   -  person HostileFork says dont trust SE    schedule 18.05.2016
comment
@HostileFork Мне нужен результат оператора оценки. Я уверен, что внутри вектора V нет -----. Так что не нужно заботиться о частных случаях.   -  person H'H    schedule 18.05.2016
comment
@H'H - а что должна возвращать функция? Логическое значение? Строковое значение с чем-то вроде (A[2] && !A[4]) || (А[1] && А[3] ) || (!А[0] && А[1] && А[3])?   -  person max66    schedule 18.05.2016
comment
@ max66 мое намерение - логическое значение. однако, если я хочу сделать это повторно для нескольких векторов, таких как «A», рекомендуется вернуть строковое значение и использовать его несколько раз или указатель на оператор оценки.   -  person H'H    schedule 18.05.2016


Ответы (1)


Я полагаю, проблема в том, что я плохо говорю по-английски, но мне не ясно, чего именно вы хотите.

Если вам нужна функция, которая с заданным вектором std::string и вектором bool возвращает значение bool, согласно вашим указаниям, это легко сделать (надеясь, что ошибок не будет).

Вы используете std::begin(), поэтому я полагаю, что C++11 вам подходит

#include <vector>
#include <iostream>
#include <stdexcept>

bool singleStatement (const std::vector<bool>  & a,
                      const std::string        & s)
 {
   auto  ret = true;

   if ( a.size() < s.size() )
      throw std::runtime_error("invalid size");

   for ( unsigned  i = 0U ; i < s.size() ; ++i )
      switch ( s[i] )
       {
         case '-': break;
         case '1': ret &= a[i]; break;
         case '0': ret &= !a[i]; break;
         default:  throw std::runtime_error("invalid char"); break;
       }

   return ret;
 }

bool statements (const std::vector<bool>        & a,
                 const std::vector<std::string> & v)
 {
   auto  ret = false;

   for ( const auto & s : v )
      ret |= singleStatement(a, s);

   return ret;
 }


int main ()
 {
   std::vector<bool>         a { true, false, false, true, false };
   std::vector<std::string>  v { "--1-0"  , "-1-1-" ,  "01-1-" }; 

   std::cout << "statement is " << statements(a, v) << std::endl;

   return EXIT_SUCCESS;
 }
person max66    schedule 18.05.2016