Как я могу фрагментировать длинную строку логического запроса в несколько небольших логических запросов - PullRequest
0 голосов
/ 01 февраля 2020

У меня длинное логическое выражение, которое нужно разбить на несколько маленьких логических выражений. Например:

Исходное выражение: 1 или (2 и 3) и (не 4 или 5) или (6 и (7 или 8 или (9 и 10))))

выражение1: 1 выражение 2: 2 и 3, а не 4 выражение 3: 2 и 3 и 5 выражение 4: 6 и 7 выражение 5: 6 и 8 выражение 6: 6 и 9 и 10

, если я оцениваю (выражение1 или выражение2 или выражение3 или expression4 или expression5 или expression6), затем я получаю свое исходное выражение.

Практически у меня есть выражение до 10000 символов с очень сложными и вложенными логическими выражениями. Есть предложения или идеи?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Если вы можете использовать переменные, вы можете преобразовать части выражения в переменные, а затем использовать эти переменные в своем выражении. Вот пример

// initial complex boolean expression
const x = "blah";
if (x === "asdfasd" || (x !== "asdfasd" && x.length < 4)) {
    // match
}

// save parts of the complex boolean expression into variables
const isCondition1 = x === "asdfasd";
const isCondition2 = x !== "asdfasd";
const isCondition3 = x.length < 4;

// use those variable
if (isCondition1 || (isCondition2 && isCondition3)) {
    // match
}

// use the variables to continue simplifying the expression
const isCondition4 = isCondition2 && isCondition3;
if (isCondition1 || isCondition4) {
    // match
}

// until you are left with one expression
const isCondition5 = isCondition1 || isCondition4;
if (isCondition5) {
    // match
}

Так что

if (x === "asdfasd" || (x !== "asdfasd" && x.length < 4)) {
    // match
}

Можно переписать как

const isCondition1 = x === "asdfasd";
const isCondition2 = x !== "asdfasd";
const isCondition3 = x.length < 4;
const isCondition4 = isCondition2 && isCondition3;
const isCondition5 = isCondition1 || isCondition4;
if (isCondition5) {
    // match
}

Я бы также переместил эти выражения в функции и организовал бы эти функции в отдельных папок / файлов.

isCondition1. js

module.exports = x => x === "asdfasd";

isCondition2. js

module.exports = x => x !== "asdfasd";

isCondition3. js

module.exports = x => x.length < 4;

isCondition4. js

const isCondition2 = require("isCondition2");
const isCondition3 = require("isCondition3");
module.exports = x => isCondition2(x) && isCondition3(x);

isCondition5. js

const isCondition1 = require("isCondition1");
const isCondition4 = require("isCondition4");
module.exports = x => isCondition1(x) || isCondition4(x);

index. js

const isCondition5 = require("isCondition5");
if (isCondition5(x)) {
    // match
}

0 голосов
/ 01 февраля 2020

Похоже, вы пытаетесь преобразовать запрос в дизъюнктивную нормальную форму . Это не сложно сделать в принципе (проанализируйте как AST, затем примените равенства по ссылке), но проблема в том, что размер вашего представления DNF может расти в геометрической прогрессии. Так что для произвольных выражений на 10 000 символов вы просто не сможете этого сделать (у вас не хватит времени и памяти).

...