KorNet 1.5
А.В. Корочков
Система программирования на основе
языка С++ для работы с моделью
данных типа
"семантическая сеть"
("KorNet")
Описание системы (1995)
(См. также KorNet
)
5.2
Макроязык системы KorNet
(часть III)
В описании макрокоманд применяются
следующие условные обозначения:
A - первый параметр,
B - второй параметр,
С - третий параметр,
и т.д.
Конкретизация типов параметров
приводится в описании макрокоманд,
например, char*.
Некоторые макрокоманды,
описываемые ниже, имеют
модификацию,
позволяющую проверить значение
переменной Result после выполнения
вызываемой в макрокоманде функции
системы. Модифицированная форма
имеет дополнительный символ
"c" в конце названия
макрокоманды и два
дополнительных параметра.
Последний в описании
модифицированной
макрокоманды параметр задает метку
оператора, к которому необходимо
перейти при наличии условия,
заданного предпоследним
параметром.
Этот параметр может принимать
значения goyes и gono. Если задано goyes,
то переход осуществляется при
Result==1, если gono - при Result==0.
Базовая и модифицированная формы
описываются совместно.
Далее в тексте выражение "сеть A
..." надо понимать как
"сеть (подсеть), начинающаяся с
узла A, ...".
merge(A,B)
mergec(A,B,C,D)
A,B - node*/fnode*
C - goyes/gono
D - метка перехода
Слить две сети, начинающиеся с
узлов A и B. После слияния двух
узлов обращение к любому из них
приведет к одному набору
атрибутов, состоящему из
совокупности наборов атрибутов
слитых
узлов. При этом одинаковые атрибуты
(не безымянные) не
дублируются. Реальное слияние
происходит только после
проверки возможности слияния всех
объединяемых узлов в
нижележащих звеньях сети. Если
слияние невозможно, после
выполнения merge сеть останется в
первоначальном состоянии.
Слияние невозможно при наличии у
объединяемых узлов одноименных
атрибутов с отличающимися
значениями.
Пример:
merge(River,Volga); // в переменных River и Volga
//содержатся указатели на узлы
семантической сети,
//полученные каким-либо из
возможных способов ранее в
//программе.
Исходное состояние 1 участка сети
до выполнения операции:
| * (River) | * (Volga) |
| | | | |
| | "filler" | | "название" |
| \--------->"water" | \-----------> "волга" |
| | "banks" | | "length" |
| \----------->2 | \-----------> 3000 |
Состояние участка сети после
выполнения операции для исходного
состояния 1:
* (River или Volga)
|
| "filler"
\---------> "water"
| "banks"
\-----------> 2
| "название"
\-----------> "волга"
| "length"
\-----------> 3000
Исходное состояние 2 участка сети
до выполнения операции:
| * (River) | * (Volga) |
| | | | |
| | "filler" | | "название" |
| \--------->"water" | \-----------> "волга" |
| | "banks" | | "length" |
| \----------->2 | \-----------> 3000 |
| | "filler" | |
| \---------> "oil" |
Состояние участка сети после
выполнения операции для исходного
состояния 2:
| * (River) | * (Volga) |
| | | | |
| | "filler" | | "название" |
| \--------->"water" | \-----------> "волга" |
| | "banks" | | "length" |
| \----------->2 | \-----------> 3000 |
| | "filler" | |
| \---------> "oil" |
См. также mergetest.
mergetest(A,B)
mergetestc(A,B,C,D)
A,B - node*/fnode*
C - goyes/gono
D - метка перехода
Проверить возможность слияния
сетей A и B. Реального слияния
не происходит.
netsnap(A,B)
netsnapf(A,B)
A - node*/fnode*
B - ofstream&
Вывести содержимое сети в поток B.
Вывод осуществляется в
зависимости от того, чем является A:
1. A - указатель на узел АС. В этом
случае выводится содержимое
АС A. Выводимая информация имеет
заголовок: "Netsnap от узла
A".
2. A - указатель на узел АСБД. В этом
случае, независимо от
конкретного значения А, будет
выводиться содержимое всей
АСБД. Сначала выводятся узлы с их
атрибутами в порядке
физического расположения узлов в
АСБД, затем атомы. Выводимая
информация будет озаглавлена:
"Ассоциативно-сетевая
база данных. Netsnap A".
В выдаче узлы обозначены условным
номером, заключенным в
круглые скобки с предшествующим
символом "*". Строка "is an
alias of <N узла>" означает, что
описываемый узел объединен с
узлом N.
Netsnapf отличается от netsnap тем, что в ее
снимке сети
присутствует информация о
количестве ссылок на узлы и
внутренних
индексах атомов.
Пример:
netsnapf(Circle,snap); //переменная Circle должна
//содержать указатель на узел
семантической сети
См. также snapfile и п.4.3.
newafnode(A)
A - fnode*
Создать новый узел в АСБД и счетчик
ссылок на него установить в
1. Указатель на созданный узел
поместить в объявленную ранее
(например, через declfnode(A))
переменную A.
newatom(A,B)
A - char*
B - node*
Найти или образовать атом A в АС и
указатель на его атомарный узел
поместить в объявленную ранее
переменную B.
newfatom(A,B)
A - char*
B - fnode*
Найти или создать,если его нет, атом
A в АСБД и указатель на его
атомарный узел поместить в
объявленную ранее переменную B.
newfnode(A)
A - fnode*
Создать новый узел в АСБД.
Указатель на него поместить в
объявленную ранее (например, через declfnode(A))
переменную A.
newnode(A)
A - node*
Создать новый узел в АС. Указатель
на него поместить в
объявленную ранее переменную A.
nextelem(A,B,C)
A - node*/fnode*
B - long/char*/node*/fnode*
C - marker
Взять следующий безымянный атрибут
узла A со значением типа B,
используя ранее определенный в
соответствующих макровызовах
allelem и nextelem
маркер C типа marker. Найденное
значение
поместить в B.
Пример:
См. allelem.
renattr(A,B,C)
A - node*/fnode*
B,C - long/char*
Переименовать у узла A атрибут B в C.
Значение атрибута остается
прежним.
Пример:
fatom("tasks",Task);
renattr(Task,"first","last");
Состояние участка сети до
выполнения операции:
"tasks"
* (Task)
|
| "first"
\---------> * (узел)
| "current"
\-----------> * (узел)
Состояние участка сети после
выполнения операции:
"tasks"
* (Task)
|
| "last"
\---------> * (узел)
| "current"
\-----------> * (узел)
savenet(A,B)
A - node*
B - идентификатор
Переписать сеть из АС, начинающуюся
с узла A, в АСБД.
Указатель на головной узел
сохраненной сети поместить в новую
переменную с идентификатором B. Эта
переменная будет иметь тип
fnode*.
Пример:
atom("newdata",newData);
savenet(newData,savedData);
fatom("repository",Reposit);
setattr(Reposit,"newdata",savedData);
setattr(A,B,C)
A - node*/fnode*
B - long/char*
C - node*/fnode*/long/char*
Привесить узлу A атрибут B со
значением C. Если у узла A такой
атрибут уже был, его значение
изменяется на новое. Если старым
значением такого атрибута был узел,
то при отсутствии ссылок на
него он удаляется.
Пример:
defnode(Factory); //создание нового узла
setattr(Factory,"улица","last");
setattr(Factory,"здание",11);
Состояние участка сети после
данных операций:
* (Factory)
|
| "улица"
\---------> "last"
| "здание"
\-----------> 11
setfnode(A,B)
A - fnode*
B - long
Поместить смещение B узла в АСБД в
ранее существовавший указатель
на дисковый узел с идентификатором
A.
snapfile(A,B)
A - char*
B - ofstream
Создать выходной поток B в файл с
именем A. После создания можно
использовать макрокоманду netsnap.
Пример:
snapfile("NETSNAP.SNP",snap);
tvdianet(A)
A - int=0
Вызов диалогового отладчика
(системы TVDiaNet).
Параметр исполь-
зуется для задания нового значения
глобальной переменной
errorMsg при работе с диалоговой
системой. По умолчанию этой
переменной присваивается 0.
Пример:
tvdianet();
Примечание.
Использование этой функции
возможно только при подключении
библиотеки TVDIANET.LIB.
| 4.1 | Интерфейсная программа TVDianet |
| 4.2 | Интерфейсная программа ClDianet |
| 4.3 | Программа создания снимка сети |
| 5.1 | Операции в сети и соответствующие им макрокоманды |
| 5.2 | Макроязык системы KorNet (часть I) |
| Макроязык системы KorNet (часть II) | |
| Макроязык системы KorNet (часть III) | |
| 5.3 | Комплектация системы |