KorNet 1.5

А.В. Корочков
Система программирования на основе
языка С++ для работы с моделью данных типа
"семантическая сеть" ("KorNet")

Описание системы (1995)

(См. также KorNet Развитие системы KorNet 1.5)


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.


  1. Модель данных
  2. Реализация сети
  3. Использование системы KorNet
  4. Дополнительные программы
    4.1 Интерфейсная программа TVDianet
    4.2 Интерфейсная программа ClDianet
    4.3 Программа создания снимка сети
  5. Приложения
    5.1 Операции в сети и соответствующие им макрокоманды
    5.2 Макроязык системы KorNet (часть I)
      Макроязык системы KorNet (часть II)
      Макроязык системы KorNet (часть III)
    5.3 Комплектация системы

KorNet Развитие системы KorNet 1.5 || Переход на основную страницу

Переход на основную страницу Рейтинг@Mail.ru
Copyright © 1999 А.В.Корочков
Последнее обновление: Август 02, 2000.
Hosted by www.Geocities.ws

1