Справочник DemonScript: Графы
Узлы и рёбра
Подробное описание работы с графами приведено в этом документе.
- X E Y - добавление ребра с типом E из узла X в узел Y со значением True. Разрешено вместо X и Y использовать массивы узлов
- X !E Y - добавление ребра с типом E из узла X в
узел Y со значением False
Вышеуказанные конструкции можно использовать внутри других команд и выражений для получения значений соответствующих рёбер!
Пример:nodes a,b,c edges in a in b //добавляем ребро с типом "in" между узлами "a" и "b" со значением "True" b !in c //добавляем ребро с типом "in" между узлами "b" и "c" со значением "False" a in [b,!c] //добавляем два ребра с типом "in" между узлами "a" и "b" и "a" и "с" со значениями "True" и "False" соответственно out a in b //выводим на экран значение ребра с типом "in" между узлами "a" и "b" out b !in c //выводим на экран отрицание значения ребра с типом "in" между узлами "b" и "c"
Вывод:True True
- X E Y = V - добавление ребра с типом E из узла X в узел Y со значением V
- X E Y -> Z E Y - добавление аксиомы в граф, которая будет выполняться при следующем вызове функции Mind.set_graph() для текущего графа. Аксиому также можно записывать в КНФ-форме: X !E Y | Z E Y.
- X(E,Y,Val) - добавление ребра с типом E из узла X в узел Y со значением Val. Если последний параметр не указан, то ребро устанавливается со значением True
- X.is_edge(E, Y) - возвращает True, если из узла X в узел Y проведено ребро E с любым логическим значением, отличным от Undef. Иначе возвращает False.
- X.path(E, Y) - возвращает True, если из узла X в узел Y существует путь по рёбрам типа E со значениями True. Если такого пути нет, но есть путь который имеет в конце ребро равное False, то возвращается False. В остальных случаях возвращается Undef. Вместо имени типа ребра E, можно задать массив рёбер: [@in, @indise].
- X.isa(Y) - возвращает True, если из узла X в узел Y существует путь по рёбру типа isa со значениями True. Если такого пути нет, но есть путь который имеет в конце ребро равное False, то возвращается False. В остальных случаях возвращается Undef. Вместо имени типа ребра E, можно задать массив рёбер: [@in, @indise].
- X.common(E, Y) - возвращает True, если двигаясь по истинным рёбрам типа E, из узлов X,Y, можно попасть в один и тот-же узел (X и Y "имеют общего предка"). Иначе возвращается False. Вместо имени типа ребра E, можно задать массив рёбер: [@in, @indise].
- X.count_out(E,Val) - возвращает число исходящих из узла X рёбер с типом E и значением Val. В случае отсутствия последнего параметра, его значение приравнивается к True
- X.count_in(E,Val) - возвращает число входящих в узел X рёбер с типом E и значением Val. В случае отсутствия последнего параметра, его значение приравнивается к True
- X.isolated() - возвращает True, если узел X является изолированным (из него и в него не входит ни каких рёбер).
- X.value(Val) - записать значение Val в узел.
- X.value() - возвращает значение узла.
- X.nodes(edge[, val]) - возвращает массив узлов, в которые из текущего ведут ребра типа edge со значением val. Если val не задан - всех ребер типа edge
- X.delete_edges(edge[, recursion]) - удаляет все ребра типа edge исходящие из узла X. Если recurison - True, то рекурсивно повторяет операцию для узлов, в которые вели удаленные ребра.
- X.bind() - привязывает узел к текущему графу
- X.unbind() - отвязывает узел от текущего графа
- X[Node] = V - устаналивает значение атрибута узла.
Если атрибут ранее не был установлен, то он устанавливается во все графы текущего класса, иначе обновляется только в текущем графе.
При установке первого утрибута в графе создается дочерний граф с именем "<имя текущего графа>_ATTR". Данный граф хранит значения атрибутов узлов родительского графа.Пример сокращенной формы (добавляем в узел masha# атрибут с именем Senses.$name и значением "Маша"):
masha#[Senses.$name] = "Маша"
Эквивалентная развернутая форма:// получаем атрибутный граф var AttrGraph = GRAPH.attr() // создаем атрибутный граф, если ранее отсутствовал if AttrGraph == None: AttrGraph = GRAPH(GRAPH.name() + "_ATTR") // добавляем новый узел, который будет хранить значение атрибута var attrNode = AttrGraph.add_node() // связываем отношением "isa" новый узел с узлом описывающим имя атрибута attrNode isa Senses.$name // записываем значение "Маша" в новый узел attrNode.value("Маша") // связываем отношением "attr" узел masha# и cозданный выше узел masha# attr attrNode
- V = X[Node] - получает значение атрибута узла. При этом атрибут сначала ищем в узле X и если не найден, ищем последовательно в узлах которые связаны с X отношением isa
- X.attr() - список всех имен атрибутов узла X.
- X.graph() - возвращает граф, к которому принадлежит узел.
- X.id() - возвращает идентификатор узла, общий для всех графов данного класса.
- exists(X, COND, n, m) - проверяет, что сущестует не менее n и не более m узлов отвечающих условию COND В результате успеха возращет True. Переменная X будет содержать значение этого узла. Иначе возвращается False если граф имеет атрибут "закрытый" (см. метод close) либо Undef если атрибут не установлен
- forall(X, COND) - возвращает True, если для всех узлов текущего графа для переменной X выполняется условие COND.
Графы
- G.changed() - возвращает True, если после последнего вызова этой функции, граф G был изменён (добавились узлы, рёбра или изменились значения рёбер)
- G.edges_changes() - возвращает количество рёбер графа G, значения которых было изменено с одного на другое. Если G.edges_changes(0), то возвращается это количество и оно сбрасывается в ноль.
- G.copy() - вернуть копию графа G в другой памяти (клонирование)
- G.class_id() - вернуть идентификатор класса графа G. Графы при копировании наследуют номер класса. И узлы всех графов одного класса имеют одинаковый набор.
- G.add_nodes(N) - добавляет в граф N безымянных узлов и возвращает ссылку на значение измененного графа
- G.add_node() - добавляет в граф один безымянный узел и возвращает его
- G.add_node(Name) - добавляет в граф один узел с именем Name и возвращает его
- G.size() - возвращает число узлов в графе
- G.nodes a, b, ... - добавляет узлы с именами a, b, ... в граф G.
- G.edges() - возвращает массив типов рёбер в графе. Если в качестве параметра передан False, то только добаленных типов ребер.
- G[index] - доступ к узлу графа по индексу
- G.name - доступ к узлу графа по имени (вместо имени можно указывать переменную, хранящую имя узла)
- G.clear_edges() - разрушить в графе G все рёбра между узлами. Узлы не меняются.
- G.delete_nodes() - удалить все узлы из графа G.
- G.edges_blocked() - возвращает флаг блокировки графа.
- G.verbose(v) - Включает (1) или выключает (0) вывод отладочных сообщений.
- G.locked(v) - Включает или выключает настройку изменения ребер (0 - разрешить менять значение с True на False и наоборот, 1 - запретить)
- G.count_out(X,E,Val) - возвращает число исходящих из узла X рёбер с типом E и значением Val. В случае отсутствия последнего параметра, возвращает число ребер с произвольным значением.
- G.count_in(X,E,Val) - возвращает число входящих в узел X рёбер с типом E и значением Val. В случае отсутствия последнего параметра, возвращает число ребер с произвольным значением.
- G.close(Val) - устанавливает графу атрибут "закрытый", который означает что все узлы определены и новые добавляться не будут. Атрибут влияет на поведение функции exists() которая в случае открытого графа вернет значение Undef если условие в аргументе не выполняется для всех узлов графа, иначе вернет False для закрытого графа
- G.attr() - возвращает ссылку на атрибутный граф.
- X.get(edge, node) - проверить, есть ли у текущего или связанных с ним по isa отношению узлов ребро типа edge к узлу node. Возвращает Logic
- X.get(edge) - вернуть массив всех узлов, к которым из текущего или связанных с ним по isa узлов ведет ребро типа edge со значением True
- X.get() - вернуть таблицу с результатами выполнения .get(edge) для всех стандартных типов ребер.
- X.json(showValues [,showInverse]) - вывести на экран структуру графа отображая значения в узлах, если showValues равно 1 и отображая инверсные ребра, если showInverse задано и равно 1
- X.senses_graph(SENSES_GRAPH) - установить граф смыслов SENSES_GRAPH для указанного графа. Узлы будут сначала искаться в текущем графе, а затем в графе смыслов для текущего графа.
- G1 + G2 - для двух графов одного (!) класса; добавить в G1 из G2 все ребра, которые в нем уже не заданы отличным от Undef значением.
- out G - выводит на экран структуру графа G (список узлов и в каждом из них список рёбер исходящих из узла и массивы узлов в которые эти рёбра входят)
- out G.dot(fileName,edgesFilter,showLoop) - выводит
структуру графа в dot-формате, который можно превратить в картинку при помощи gvedit
из пакета GraphViz
fileName - имя файла в который будет выведен граф (по умолчанию граф выводится на экран);
edgesFilter - список типов рёбер которые будут выведены в файл (по умолчанию выводятся все рёбра);
showLoop - выводить рёбра которые связывают узел с самим собой (по умолчанию True).
- out G.str() - выводит на экран структуру графа G "на естественном языке"
- G.load(file,mode) - загружает граф из файла, расширение которого соответствует формату:
.dic - база смыслов в виде: sense1:{isa:[sense2]}, sense2:{isa:[sense3]} ...
mode - режим загрузки (0-загружаем узлы и ребра, 1-загружаем узлы, их значения и ребра)
Пример:GRAPH.load("senses.dic",1) //загружаем фал "senses.dic" с режимом 1 out GRAPH=>$$entity.value() //выводим значение узла
Вывод:{ def_ru:[нечто реально существующее, которое можно увидеть], en:[entity], name:entity, ru:[сущность] }