如何通过在 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));
那个
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(' '));
}
使用已经开发的工具真值表计算器轻松操作,为您的生活带来便利。