Справочник DemonScript: Mind
Объект Mind служит для задания аксиом и проведения логических выводов. Подробное описание по работе с ним приведено в этом документе.
- Mind.add() - добавить аксиому или список аксиом, перечисленных через запятую. Каждая аксиома должна быть в конъюнктивной нормальной форме: A | B | !C | !D | E | ... или в эквивалентном виде с использованием импликации: !A & C & !E & ... -> B | !D (слева только конъюнкции, справа - только дизъюнкции).
- Mind.set_graph(G, group) - установить все рёбра в графе G в соответствии с аксиомами. В частности, G может быть текущим графом GRAPH (параметр обязателен). Если задан параметр group (целое число = номеру группы аксиом, см. метод group), то будут использоваться только аксиомы из группы group.
- Mind.differnt_vals(v) - исключить дублирование переменных при проверке аксиом. После установки флага в 1, теперь нет необходимости в аксиомы добавлять проверки типа: X!=Y.
- Mind.get_models(G, E, MAX_NUM=10) - получить все возможные модели. Возвращает массив графов, которые получаются из графа G всеми возможными (и разрешёнными аксиомами) установками ребра типа E в True или False. Последний параметр ограничивает число моделей (по умолчанию десятью). Если MAX_NUM=0 - ограничений нет. Пример вызова: var Models = Mind.get_models(GRAPH, @in, 0).
- Mind.count_models(G, E) - поcчитать число всех возможных моделей (см. метод .get_models). Возвращает число, а не массив и не имеет ограничения по максимальному числу моделей. Пример вызова: out Mind.count_models(GRAPH, @in)
- Mind.validator(demon(G)) - задание валидатора для методов get_models() и count_model(). Валидатор - это демон с одним аргументом типа граф. Он должен возвращать логическое значение. Если валидатор для данного графа G не возвращет True, то модель считается не верной и не помещается в список моделей для get_models или в число возможных моделей для count_models. Пример использования см. в "города и дороги".
- Mind.value(Models, Expr) - вычисление логического значения Exprs по массиву возможных моделей Model, который может быть получен методом get_models. Если во всех моделях это выражение имеет одно и тоже заначение, оно и возвращается методом. Если значение от модели к модели меняется, то метод возвращает Undef. Пример вызова: Mind.value(Models, $A.@r.$B), см. также "города и дороги".
- Mind.add_usual() - добавить вероятностную аксиому следующего вида:
!A & C & !E & ... -> B == (p0,p1) ,
котрая эквивалентна двум аксиомам:
!A & C & !E & ... -> B с вероятностью p1 и
!A & C & !E & ... -> !B с вероятностью p0
- Mind.split_graph(GRAPH, EDGES, MODEL_P, SAVE_LOG) - находит в GRAPH неопределенное
ребро с отношением из списка EDGES и создает две модели, в одной неопределенное ребро устанавливается в значение False,
а в другой в значение True.
MODEL_P - коэффициент правдоподобности графа GRAPH;
SAVE_LOG - сохранять лог ветвления GRAPH;
Возвращает массив объектов моделей, каждый элемент которого имеет следующую структуру:
- "graph" - граф после разделения
- "p" - коэффициент правдоподобности модели графа
- "log" - лог ветвления (если был установлен флаг SaveLog)
- Mind.split_graph_usual(GRAPH, MODEL_P, MODEL_N, SAVE_LOG) - применяет для GRAPH вероятностные
аксиомы до тех пор, пока не сработает первая более правдоподобная, затем создает две модели графа
в одной из которых устанавливает ребро сработавшей аксиомы в True, а в другой False и пересчитывает
правдоподобность модели в зависимости от вероятности сработавшей аксиомы.
MODEL_P - коэффициент правдоподобности графа GRAPH;
MODEL_N - глубина ветвления модели (необходима для расчета коэффициента правдоподобности) новых моделей;
SAVE_LOG - сохранять лог ветвления GRAPH;
Возвращает массив объектов моделей, каждый элемент которого имеет следующую структуру:
- "graph" - граф после разделения
- "p" - коэффициент правдоподобности модели графа
- "n" - глубина ветвления графа
- "log" - лог ветвления (если был установлен флаг SaveLog)
- Mind.get_usual_models(GRAPH, EDGES, MAX_NUM=10,MIN_P=0,MAX_P=1) - получить все возможные модели GRAPH, используя вероятностные аксиомы.
EDGES - список отношений, по которым разрешено ветвление;
MAX_NUM - максимальное число моделей;
MIN_P - минимальное значение коэффициента правдоподобности;
MAX_P - максимальное значение коэффициента правдоподобности;
Возвращает массив объектов моделей, каждый элемент которого имеет следующую структуру:
- "graph" - граф после разделения
- "p" - коэффициент правдоподобности модели графа
- Mind.merge(G1,G2,EXCLUDES) - выполняет обединение графов G1 и G2 следующим образом:
- Выполняем поиск отношений, которые имеют противоположные значения в обоих графах и добавляем их в массив DONT_COPY;
- Содержимое списка EXCLUDES переносим в массив DONT_COPY;
- Идем по списку DONT_COPY и отменяем те сработавшие аксиомы в которых элемент DONT_COPY находился в посылке;
- Следствия отмененных аксиом тоже добавлеям в массив DONT_COPY;
- Повторяем пункты 3-4 до тех пор, пока массив DONT_COPY не перестанет расширятся;
- Выполняем поиск отношений, которые определены в одном графе и не определены в другом и добавляем их в массив WAIT_COPY;
- Из списка WAIT_COPY исключем отношения массива DONT_COPY;
- Отношения массива WAIT_COPY переносим в противоположный граф.
- Выполняем поиск отношений, которые имеют противоположные значения в обоих графах и добавляем их в массив DONT_COPY;
- Mind.verbose(level=0) - установить режим отладки логического вывода. Если level=1 - аксиома выводится когда она "срабатывает" и даёт новое значение для отношения. Если level=2, то происходит вывод промежуточных моделей в методах get_models, count_models. По умолчанию level=0 (ни чего не выводится).
- Mind.out() - вывести аксиомы Mind в его внутреннем представлении вместе с числом использований каждой аксиомы при логическом выводе.
- Mind.set_mode(1) - задать номер моды логического вывода. Если аргумент равен 1 - проводится работа с трёхзначной логикой (это быстрее). Если аргумент равен 2 - то вывод проводится в рамках нечёткой логики (пока в работе).
- Mind.clear_used() - очистить счётчик использования каждой аксиомы. Он находится в колонке used при выводе списка аксиом методом .out()
- Mind.clear() - очистить список всех аксиом.
- Mind.group(g) - установить номер группы аксиом. После этого вызов метода .add будет присваивать всем аксиомам номер группы g.
- set(AXIOM) - выполнить аксиому AXIOM в месте вызова данной функции