将 truthTable 结果转换为布尔语句
convert truthTable result into Boolean statement
我正在尝试将 truth-table 的结果转换回布尔语句。
对于那些不熟悉的人,我将详细介绍。
我有一个字符串向量,格式如下。 vector 中的所有字符串成员都具有相同的长度。成员仅由-
或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
作为输入的函数,并且 return 在布尔语句之上。我相信您已经注意到 1
是 true
,0
是 Not true
并且 -
是无关状态。
编辑:我不打算解决 truthTable 或 Kmap。我已经有了结果。我的结果格式为 "v" 矢量。我想使用布尔语句在 V 和 A 之间创建一个 link。
如有任何建议,我们将不胜感激。
我想问题是我的英语说得不好,但我不清楚你到底想要什么。
如果你想要一个给定std::string
向量和bool
return向量的函数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;
}
我正在尝试将 truth-table 的结果转换回布尔语句。 对于那些不熟悉的人,我将详细介绍。
我有一个字符串向量,格式如下。 vector 中的所有字符串成员都具有相同的长度。成员仅由-
或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
作为输入的函数,并且 return 在布尔语句之上。我相信您已经注意到 1
是 true
,0
是 Not true
并且 -
是无关状态。
编辑:我不打算解决 truthTable 或 Kmap。我已经有了结果。我的结果格式为 "v" 矢量。我想使用布尔语句在 V 和 A 之间创建一个 link。
如有任何建议,我们将不胜感激。
我想问题是我的英语说得不好,但我不清楚你到底想要什么。
如果你想要一个给定std::string
向量和bool
return向量的函数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;
}