от других ограничений).
Что-то вроде этого
A = (f1, f2, f3, f4) => f2 + f3 > f1.length && !!f4;
B = (f2, f3, A) => (f3 > 15 ? f2 > 5 : A);
C = (f2, f4) => (f4 === 5 ? !f2 : true);
D = (f1, f4) => (f4 === 4 ? !f1 : true);
Изначально все f* имеют какие-то значения.
1) При изменении одного из f* необходимо эффективно пересчитать ограничения.
2) Необходимо уметь предсказать "какую переменную нужно изменить и по каким условиям, чтобы удовлетворить ограничения", условие - это поддерево ограничения, т.е. для f2 в C наиболее релевантным было бы !f2 (это предположение).
Вариант решения, которое я предполагаю сейчас:
1) Построить матрицу смежности (Dependency graph, это не очень сложно):
f1: A D
f2: A B C
f3: A B
f4: A C D
2) Развернуть его в что-то вроде(как это сделать большая загадка для меня):
f1: {
A: {
root: f2 + f3 > f1.length, // for f2 + f3 search all constraints with f2 + f3? no. Ref constraints with f2, f3 and set as dict.
deps: {
f2: {
B: f3 > 15 ? f2 > 5, // берем выражение от переменной вверх до result, т.к. оно содержит все реальные зависимости
},
f3: {
B: f3 > 15, // отбрасываем те его части, которые не связаны с этой переменной??
}
},
},
D: {
root: f4 === 4 ? !f1,
deps: {
f4: {
C: { ...},
D: { ... },
}
}
}
}
3) Показывать пользователю словесное представление условий f2 + f3 > f1.length в порядке глубины. Предлагать перейти к редактированию значений в том же порядке.
Это(само предсказание пользователю) похоже можно решить с PageRank(graphbolt). Но я очень смутно вижу как решать все в целом.
https://github.com/pdclab/graphbolt
https://sci-hub.st/10.1145/3302424.3303974
https://sci-hub.st/10.1145/3093336.3037748
хм, а тебе в каком-то конкретном случае надо решить или для произвольного/вариативного набора ограничений?
Обсуждают сегодня