生成真值表

Generate Truth Table

提问人:Utam Rauniyar 提问时间:12/15/2022 最后编辑:Rory McCrossanUtam Rauniyar 更新时间:12/16/2022 访问量:524

问:

如何通过在Javascript中编码三个文字(,,)来生成真值表,并找到给定的布尔表达式?abc(![(a && b) || c])

我正在尝试以下代码:

let input = ['a', 'b', 'c'];
let expression = ['(a&&b)', '((a&&b)||c)', '(!((a&&b)||c))'];
let tableValue = [];

function exp(input, expression) {
  for (let i = 0; i <= Math.pow(2, input.length) - 1; i++) {
    for (let j = 0; j <= input.length - 1; j++) {
      if (('a&&b')) {
        tableValue[j] = (i & Math.pow(2, j)) == false;
      }
    }
    console.log(tableValue);
  }
}
console.log(exp(input));

JavaScript 逻辑 boolean-logic boolean-expression 真值表

评论

0赞 Rory McCrossan 12/15/2022
就目前而言,您的问题太宽泛了。您当前的代码有什么问题?您希望看到什么输出?
0赞 Utam Rauniyar 12/15/2022
我的问题是生成这样的真值表 a b c a&&b (a&&b)||例如 g((a&&b)||c) ------------------------------------------------- T T T F T F F T F F T F T F F T F F T

答:

1赞 Bergi 12/16/2022 #1

这并不能评估任何事情。它是一个字符串,而不是可以使用值调用的函数。这是你应该使用的东西,例如if (('a&&b'))

const expression = (a, b, c) => (!((a&&b)||c));

然后,您可以通过调用函数来填充表,例如

const expression = (a, b, c) => !((a&&b)||c);
const tf = x => x?'T':'F'
for (let i = 0; i < 2; i++) {
  for (let j = 0; j < 2; j++) {
    for (let k = 0; k < 2; k++) {
      const a = Boolean(i), b = Boolean(j), c = Boolean(k);
      console.log(`a: ${tf(a)}, b: ${tf(b)}, c: ${tf(c)}, result: ${tf(expression(a, b, c))}`);
 //                                                                    ^^^^^^^^^^^^^^^^^^^
    }
  }
}

除了日志记录之外,您还可以构建一个表行值对象(并在以后对其进行格式化),并且使用按位运算符的方法,您可以对任意数量的布尔变量执行此操作:

function exp(input, expression) {
  const rows = [];
  for (let i = 0; i < (1 << input.length); i++) {
    const entries = input.map((name, j) =>
      [name, (i >>> j) & 1 == 1]
    );
    const values = entries.map(e => e[1]);
    const obj = Object.fromEntries(entries);
    obj.result = expression(...values);
    rows.push(obj);
  }
  return rows;
}
const table = exp(
  ['a', 'b', 'c'],
  (a, b, c) => ((a&&b)||c)
);
for (const row of table) {
  console.log(Object.entries(row).map(([k, v]) => `${k}: ${v?'T':'F'}`).join(', '));
}

如果您坚持使用以下形式,也可以使用以下形式使用字符串形式的动态表达式来执行此操作:eval

const expressions = ['(a&&b)', '((a&&b)||c)', '(!((a&&b)||c))'];
const input = ['a', 'b', 'c'];
const functionsByExpr = Object.fromEntries(expressions.map(expr =>
  [expr, new Function(...input, `return ${expr};`)]
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
));

const rows = [];
for (let i = 0; i < (1 << input.length); i++) {
  const entries = input.map((name, j) =>
    [name, (i >>> j) & 1 == 1]
  );
  const values = entries.map(e => e[1]);
  const obj = Object.fromEntries(entries);
  for (const expr of expressions) {
    obj[expr] = functionsByExpr[expr](...values);
  }
  rows.push(obj);
}

console.log(input.join(' ')+' → '+expressions.join(' '));
console.log('-'.repeat(input.reduce((s,i) => s+i.length+1, expressions.reduce((s,e) => s+e.length+1, 1))));
for (const row of rows) {
  const cell = c => ' '.repeat(c.length/2-1) + (row[c]?'T':'F') + ' '.repeat(c.length/2)
  console.log(input.map(cell).join(' ')+' | '+expressions.map(cell).join(' '));
}