一个逻辑问题
g思考链接
https://juejin.cn/post/7005869798483558431
根据上面的思路 构造出来一个
构造出了这样的但如果我再加一条
保存的时候 变成了
信号1 > 2 and 信号1 == 2 and (BLE工作状态BleSts >= 4)
哎 我不是输入的不是一个且 一个或吗 怎么出来的却是两个and
答案是
因为 ops 是定义在当前节点上的逻辑操作符,它决定了它的子节点之间用 and 或 or 连接。
{
"ops": "and",
"children": [ ... , { "ops": "or", "children": [...] } ]
}
最外层是 and,所以所有一级子项(包括那个 or 节点)都用 and 连接。
内部的 or 节点只影响它自己的子项之间的连接方式。
所以输出是:
... and (BleDoorLockCmd < ...)
那如果我想输入A = 1 or B = 2 and(a==1)j就不行吗
在逻辑上是有歧义的,因为没有明确的优先级说明,不同系统可能解析方式不同。
但在你当前的 conditionToString 实现中,是无法直接表达这种混合逻辑优先级的结构的,原因如下:
你希望的是
A = 1 or B = 2 and a == 1
但这其实是
A = 1 or (B = 2 and a == 1)
也就是 and 的优先级高于 or,需要嵌套结构来表达优先级。
正确的结构应该是
{
"ops": "or",
"children": [
{
"key": "A",
"op": "=",
"value": "1"
},
{
"ops": "and",
"children": [
{
"key": "B",
"op": "=",
"value": "2"
},
{
"key": "a",
"op": "==",
"value": "1"
}
]
}
]
}
输出A = 1 or (B = 2 and a == 1)
为什么你写不出来 A = 1 or B = 2 and a == 1?
因为当前结构不支持混合逻辑优先级,每个节点只能统一用 and 或 or 连接子项
如何表达 A = 1 or (B = 2 and a == 1)?
需要用嵌套结构,把 and 放在 or 的一个子节点里
是否需要改写 conditionToString?
不需要,当前函数已经支持嵌套结构,只需要构造正确的输入对象即可
你可以这样输入
const input = {
ops: 'or',
children: [
{ key: 'A', op: '=', value: 1 },
{
ops: 'and',
children: [
{ key: 'B', op: '=', value: 2 },
{ key: 'a', op: '==', value: 1 },
],
},
],
};