生成真值表

问题描述 投票:0回答:2

如何通过在 Javascript 中编码三个文字(

a
b
c
)来生成真值表,并找到给定的布尔表达式
(![(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 logic boolean-logic boolean-expression truthtable
2个回答
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(' '));
}


0
投票

使用已经开发的工具真值表计算器轻松操作,为您的生活带来便利。

© www.soinside.com 2019 - 2024. All rights reserved.