|
|
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
Не натолкнет ли кто на мысль как сохранить в БД следующее выражение: (^A || (B & ^C)) & (D || F) думаю уровень вложенности не более двух... а потом главное проверить как то... т.е. грубо говоря в БД будет несколько таких выражений, и есть набор значений: A = true B = false C = true ... и надо найти какое подходит... все дело в хранении, а не в проверке. Поясняю почему: мне не надо чтобы такую чушь видел пользователь составляющий выражения, он должен видеть конструктор какой то. А я должен это хранить, желательно НЕ строкой как есть... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 09:59 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
Я бы попробовал для начала переводить выражения в совершенную дизъюнктивную или совершенную конъюнктивную нормальную форму. Вложенность в этом случае не имеет никакого значения. А вот что делать дальше - надо подумать - не факт, что это вам значительно поможет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 10:21 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
2Николай aka Motodor Перенесите пожалуйста обратно... Это мой топик и это делается под ВЕБ, так что не совсем оффтоп Поясняю: Есть набор ситуаций : Ситуация 1 Ситуация 2 Есть набор правил , при который выполняется ситуация: Если (П1=1 и П2=13) или П3=234 - тогда ситуация 1 выполняется Если (П1=2 или П2=15) и П3!=123 - тогда ситуация 2 выполняется где П1, Пn - параметры и через равно их значения... Так же есть набор справочников : П1 П2 П3 Есть значения элементов справочника : П1: 1,2,3,4,5,6,7,8 П2: 11,12,13,14,15,16,17,18 П3: 21,22,23,42,25,26,27,28 Теперь мне надо составить набор правил для ситуации 4 например. Она выполняется когда срабатывает условие: (П1=1 и не(П3!=21 или П2=1)) или П3=234 А уже потом вводя значения параметров П1, П2, П3, П4 необходимо определить к какой ситуации это относится. Если не делать сложных правил для определения правил, тогда все просто, когда ситуация срабатывает при П1=1 и П2=12 и П3=42 это все элементарно как "два в десятой". Думается насчет хранения такая мысль: Использовать для вложенных правил NestedSets Узлы дерева имеют следующие характеристики: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. итого (П1=1 и не(П3!=21 или П2=1)) или П3=234 разбивается на несколько элементов Код: plaintext 1. 2. 3. 4. 5. 6. cid = 1 cleft = ... cright = ... clevel = ... c_is_group = true c_operation = OR c_sign = 0 cvalue_id = NULL, так как группа ccache = (П1=1 и не(П3!=21 или П2=1)) для второго: cid = 2 cleft = ... cright = ... clevel = ... c_is_group = false c_operation = OR c_sign = 0 cvalue_id = 1 ccache = (П1=1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 11:25 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
Неужели тут и вправду всех интересуют только вопросы о непередающихся переменных? :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 14:57 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
ЛогикНеужели тут и вправду всех интересуют только вопросы о непередающихся переменных? :-)))Да непростая задачка. И, кстати, она не столько по вэб-программированию, сколько по алгоритмам вообще. В отличии от вопросов о непередающихся переменных тут думать надо, на что необходимо время :) Так что удивляться тому, что мгновенного ответа вы не получите (а возможно в итоге вообще будете вынуждены решить задачу самостоятельно) - не стоит. Всё же я бы копал в сторону СДНФ/СКНФ. Занёс бы каждую элементарную конъюнкцию/дизъюнкцию в отдельную строку таблицы, добавив к ним поле id-формулы, затем что-то типа SELECT formula_id WHERE SUM(IF(выражение для строки,0,1))=0 GROUP BY formula_id В результате выборки получим id выражений, СДНФ/СКНФ которых равны нулю. PS: всё это рассматривать не более, чем как гипотезу :) Т.е. грубо говоря - мысли вслух. SQL-выражение можно считать написанным от балды - но, думаю, идея понятна. PPS: было бы интересно увидеть решение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2005, 15:46 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
http://xpoint.ru/forums/programming/theory_algorythms/thread/29320.xhtml еще рассуждения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 04:44 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
http://www.phpclasses.org/browse/package/1344.html ------------------------------- www.free-lancer.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2005, 13:03 |
|
||
|
Хранение логики предикатов в БД
|
|||
|---|---|---|---|
|
#18+
VERShttp://www.phpclasses.org/browse/package/1344.html ------------------------------- www.free-lancer.ru VERS - респект!! Скачал, смотрю! Ты умница, то что надо! Там действительно стоящий пример!!! Моя теория нашла воплощение, поясняю: я храню все правила в NestedSets, чтобы ими было удобно оперировать экспертам в конструкторе. Способ хранения я указал выше... Далее: при изменении правила, я кэширую заново формулу в строку (^A || (B & ^C)) & (D || F) где вместо F,B,C,D,F будут цифры... Далее, при создании правила я буду записывать в отдельную таблицу условия например условие А: если "Цвет" == "зеленый" т.е. будет таблица УСЛОВИЯ * ID [PK] * RefBookId - справочник * RefBoodItemId - элемент справочника т.е. если справочник Цвет имеет идентификатор 12, а элемент справочника "Зеленый" идентификатор 123, то запись в таблице будет такой: 1,12,13 надо только следить, чтобы они не дублировались... все, подготовка закончена, потом получая некие условия, параметры просто тупо перебираем формулы для ситуаций и подставляем значения тут я просто выдрал первый попавшийся пример, чтобы показать синтаксис Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. думаю к новому году мне будет что показать :-) всех с наступающим!!! я счастлив! :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2005, 07:17 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=33434848&tid=1477087]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
164ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 491ms |

| 0 / 0 |
