纯度
布尔表达式简化器
剖析( 字符串)
将逻辑表达式的字符串表达式转换为表达式对象
import { parse } from '@fordi-org/bsimp/parse';
console.log(parse('A+A!B'));
[ Symbol( ∪ ), Symbol(A), [ Symbol( ∩ ), Symbol(A), [ Symbol(!), Symbol(B) ] ] ]
至 String( 表达式)
将表达式对象转换为字符串
import { parse, toString, SET } from '@fordi-org/bsimp';
console.log(toString(parse('A+A!B'), SET));
console.log(toString(parse('A+A!B'), LOGIC));
console.log(toString(parse('A+A!B'), POLISH));
console.log(toString(parse('A+A!B'), SOURCE));
A ∪ (A ∖ B) A+A!B (∪ A (∩ A !B)) [OR, A, [AND, A, [NOT, B]]]
简化(表达式,[步骤])
简化象征布尔的表达式。 可选地通过数组来收集步骤 .
import { simplify, parse, toString, LOGIC } from '@fordi-org/bsimp/simplify';
const toSimplify = [
'A+B!C+C!A',
'AB!C+ABC+A!B!C+B!A!C',
];
const result = toSimplify.map(expStr => {
const exp = parse(expStr);
const steps = [];
const simple = simplify(exp, steps);
return {
simplified: toString(simple, LOGIC),
steps,
};
});
console.log(result);
[ { simplified: 'A+B+C', steps: [ [ 'absorption', null, [OR, A, [AND, B, [NOT, C]], [AND, C, [NOT, A]]], [OR, A, C, B] ] ] }, { simplified: 'AB+A!C+B!C', steps: [...], } ]
步骤的结构是[transform, (中文(简体) ), parentOperation, (中文(简体) ), fromExpr, (中文(简体) ), toExpr[ [ ] [ ] ]. ].
符号( termStr)
将字符串转换为符号 。 对于And, or, Not, TRUE, 和FALSE, 这将将字符串转换为内部符号. 对于其他弦,你会得到 term(termStr)。 。 。 .
术语( termStr)
将字符串转换为符号 。 对于任何以前命名的术语,你会为同一个输入字符串获得相同的符号(这与如何使用不同) Symbol(termStr) 作品,因为每个符号都是独一无二的.
表达式对象
形式上...
- 表达式: [操作器,... Operand]
- 运算符: 和 QQ 或 NQ NOT
- 行动:TRUE QQ FALSE QQ符号 QQ表达式
也就是说,它是一个阵列,其中第一个元素必须是运算符,以下所有符号必须是操作符. 运算符是符号 AND, (中文(简体) ), OR,以及 NOT (从 @fordi-org/bsimp) (中文(简体) ). 操作可以是符号 TRUE 或者说 FALSE,其他表达式,或任何用户定义的符号.
表达式字符串
语法非常宽容,允许使用下列语法:
波兰语标记
{OP} {TERM} {TERM}*
例如,
"(and A B C)" 变成 [AND, A, B, C]
插件标记
{TERM} ({OP} {TERM})*
例如,
(P | Q | R) 变成 [OR, P, Q, R]
初专
解析器能理解Tronary表达式 CODE 字符串符知道如何将表达式转换为它们,但是,它们被表达为逻辑组合 AND, (中文(简体) ), OR,以及 NOT十三分之一,如果你不知道, 就像一个如果/然后/ 其它统计, 其中每块是一个名词.
这么说吧, C ? T : F 评估到 [OR, [AND, C, T], [AND, [NOT, C], F]]。你可以筑巢,但必须将其组合起来以避免模糊.
对三进制的支持旨在帮助将表达式传递到简化符中,而 CODE 串接器可以识别并包含这种模式的简单形式,被嵌入的三角体通常会被简化为某种 CODE 字符串无法识别(例如, a ? (b ? c : d) : e 将变成 (a && b && c) || (e && !a) || (a && !b && d)这不理想.
我可能对此做更多的工作,但三者支持最初意在作为投入.
隐含和
{TERM}{TERM}*
例如,
XYZ 变成 [AND, X, Y, Z]
注:由于需要隐含和, 解析器将术语限制为单字母、大小写敏感。 简化器没有那么有限,你可以做这样的事情:
const [a, b] = [
term('longName'),
term('longerName'),
];
const simple = simplify([OR, a, [AND, a, [NOT, b]]]);
我所想到的两个使用例是linters的布尔简化符(linter可以选择完全随机的符号名),以及一页上逻辑简化符件(用户可以输入紧逻辑字符串并重新获得其简化符).
发展问题
要运行测试套件:
npm run test
要编译布尔语法:
npm run build:peg
为了建立整个事情:
npm run build