powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Хранение логики предикатов в БД
8 сообщений из 8, страница 1 из 1
Хранение логики предикатов в БД
    #33434848
Логик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не натолкнет ли кто на мысль как сохранить в БД следующее выражение:

(^A || (B & ^C)) & (D || F)

думаю уровень вложенности не более двух...

а потом главное проверить как то...

т.е. грубо говоря в БД будет несколько таких выражений, и есть набор значений:
A = true
B = false
C = true
...

и надо найти какое подходит...

все дело в хранении, а не в проверке.

Поясняю почему:
мне не надо чтобы такую чушь видел пользователь составляющий выражения, он должен видеть конструктор какой то. А я должен это хранить, желательно НЕ строкой как есть...
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33434918
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Я бы попробовал для начала переводить выражения в совершенную дизъюнктивную или совершенную конъюнктивную нормальную форму. Вложенность в этом случае не имеет никакого значения. А вот что делать дальше - надо подумать - не факт, что это вам значительно поможет :)
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33435116
Логик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
* cid
* cleft
* cright
* clevel
* c_is_group   - флаг является ли групповым
* c_operation  - знак перед выражением (AND/OR), означает то, какой оператор соединяет его с предыдущим в этой подветке, 
   если элемент первый, тогда ставится по умолчанию оператор OR и он будет присоединяться к нулю, так как 0 || некоторое число == это же самое некоторое число
* c_sign         - флаг:  отрицание элемента или группы
* cvalue_id     - идентификатор значения элемента
* ccache        - кэшированное выражение 


итого
(П1=1 и не(П3!=21 или П2=1)) или П3=234
разбивается на несколько элементов

Код: plaintext
1.
2.
3.
4.
5.
6.
1) - (П1=1 и не(П3!=21 или П2=1))
2) -- П1=1
3) -- не(П3!=21 или П2=1)
4) --- П3!=21
5) --- П2=1
6) - П3=234
Для первого:
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)
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33435879
Логик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели тут и вправду всех интересуют только вопросы о непередающихся переменных?

:-)))
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33436033
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
ЛогикНеужели тут и вправду всех интересуют только вопросы о непередающихся переменных?

:-)))Да непростая задачка. И, кстати, она не столько по вэб-программированию, сколько по алгоритмам вообще. В отличии от вопросов о непередающихся переменных тут думать надо, на что необходимо время :) Так что удивляться тому, что мгновенного ответа вы не получите (а возможно в итоге вообще будете вынуждены решить задачу самостоятельно) - не стоит. Всё же я бы копал в сторону СДНФ/СКНФ. Занёс бы каждую элементарную конъюнкцию/дизъюнкцию в отдельную строку таблицы, добавив к ним поле id-формулы, затем что-то типа
SELECT formula_id WHERE SUM(IF(выражение для строки,0,1))=0 GROUP BY formula_id
В результате выборки получим id выражений, СДНФ/СКНФ которых равны нулю.
PS: всё это рассматривать не более, чем как гипотезу :) Т.е. грубо говоря - мысли вслух. SQL-выражение можно считать написанным от балды - но, думаю, идея понятна.
PPS: было бы интересно увидеть решение.
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33436984
*|*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*|*
Гость
http://xpoint.ru/forums/programming/theory_algorythms/thread/29320.xhtml
еще рассуждения
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33437879
VERS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.phpclasses.org/browse/package/1344.html

-------------------------------
www.free-lancer.ru
...
Рейтинг: 0 / 0
Хранение логики предикатов в БД
    #33439663
Логик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
<?
require '../FirstOrderLogicProp.inc.php';
$p = new FirstOrderLogicProp('(a <!> b) & (b -> a)');
$p->writeLn();
$q = &$p->clone();
$q->clean();
$q->writeLn();
$p->setValues(array('a'=>'1', 'b'=>'0'));
$p->replaceWithValues();
$p->writeLn();
$p->clean();
$p->writeLn(); 
?>

думаю к новому году мне будет что показать :-)

всех с наступающим!!!

я счастлив! :-)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Хранение логики предикатов в БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]