48530 (588561), страница 7
Текст из файла (страница 7)
Рисунок 4.11 - Просмотр всех имеющихся в базе фактов
Для того, чтобы добавить вопрос объекта, необходимо ввести имя объекта, например "ветер на здание", и вопрос - "какова концентрация". После этого нажать кнопку "4. Добавить вопрос объекта" (рис.4.12).
Рисунок 4.12 - Добавление вопроса об объекте
Все имеющиеся в базе факты, включающие сведения об объектах, их значениях, коэффициентах доверия, коэффициентах ущерба и вопросах, можно сохранить в текстовый файл rules. txt. Для этого необходимо нажать кнопку "Сохранить базу в файл".
Файл rules. txt будет иметь следующее содержание - рис.4.13.
Рисунок 4.13 - Содержание файла rules. txt
Для того, чтобы получить вопрос об объекте, необходимо ввести имя объекта ("ветер на здание") и нажать кнопку "5.1. Получить вопрос об объекте". В поле "Вопрос" выведется имеющийся в базе вопрос о данном объекте ("какова концентрация").
Для установления конкретного (одного) значения объекта из нескольких имеющихся (например, значения "концентрация <1%" для объекта "ветер на здание") необходимо выбрать номер значения 2 и нажать кнопку "5.2. Ответить на вопрос об объекте" (рис.4.14).
Рисунок 4.14 - Установка ответа на вопрос
Для ситуации "выброс газа" определим наименее вероятный сценарий развития событий, наиболее вероятный сценарий развития событий, сценарий с наименьшим ущербом, сценарий с наибольшим ущербом.
При нажатии кнопки "6. Поиск наименее вероятного сценария развития событий" в окне "Ход выполнения" отобразятся все возможные варианты развития событий, наименее вероятный сценарий развития событий, его вероятность и коэффициент ущерба (рис.4.15).
Рисунок 4.15 - Поиск наименее вероятного сценария развития событий
При нажатии кнопки "7. Поиск наиболее вероятного сценария развития событий" в окне "Ход выполнения" отобразятся все возможные варианты развития событий (рис.4.15), наиболее вероятный сценарий развития событий, его вероятность и коэффициент ущерба (рис.4.16).
Рисунок 4.16 - Поиск наиболее вероятного сценария развития событий
Для того, чтобы определить сценарий с наименьшим ущербом, необходимо нажать кнопку "8. Поиск сценария с наименьшим ущербом". Результаты поиска отобразятся в окне "Ход выполнения" (рис.4.17).
Рисунок 4.17 - Поиск сценария с наименьшим ущербом
Для того, чтобы определить сценарий с наибольшим ущербом, необходимо нажать кнопку "9. Поиск сценария с наибольшим ущербом". Результаты поиска отобразятся в окне "Ход выполнения" (рис.4.18).
Рисунок 4.18 - Поиск сценария с наибольшим ущербом
Для окончания работы с программой необходимо нажать кнопку "Выход".
5. Техническое обеспечение
Программа функционирует на универсальной ПЭВМ. ПЭВМ имеют небольшие габариты, обладают большой мощностью и быстродействием.
Для реализации программного обеспечения "МАГ" необходим набор аппаратных средств со следующими минимальными техническими характеристиками:
процессор INTEL Pentium IV с тактовой частотой 1,5 ГГц,
объем оперативной памяти не менее 128 Мб;
жесткий диск объемом 2 Гб;
видеоадаптер SVGA;
клавиатура;
манипулятор мышь;
17" SVGA монитор.
Выбор данного комплекса технических средств обусловлен требованиями, предъявляемыми к надежному обеспечению безопасности магистральных газопроводов, а именно:
оперативность и качество принимаемых управленческих решений,
необходимость наличия обширной информации о возможных ситуациях, возникающих при предаварийной и аварийной работе магистрального газопровода.
Кроме того, выбранный комплекс технических средств отвечает требованиям программного обеспечения "МАГ" - требованиям выбранного языка Delphi 7.
Заключение
В данной выпускной квалификационной работе были рассмотрены принципы обеспечения безопасности магистральных газопроводов.
В частности, в ходе выполнения работы выделены основные характеристики и поражающие факторы аварий на объектах нефтегазового профиля. Кроме того, выделены причины возникновения аварий на объектах транспорта газа и причины роста числа таких аварий. Это позволило определить основные направления обеспечения безопасности магистральных газопроводов.
В работе были рассмотрены существующие методы анализа риска. В результате было установлено, что для реализации процесса управления безопасностью объектов транспорта газа целесообразно использовать логико-графические методы построения и анализа "дерева отказов" и "дерева событий".
Кроме того, проведен анализ риска, включающий следующие стадии:
идентификация опасностей - выделены основные присущие системе транспорта газа опасности;
анализ частоты аварий - построены "дерево отказов" и "дерево событий", рассчитаны вероятности и частоты реализации возможных сценариев;
анализ последствий аварий - оценено воздействие опасных факторов на имущество, людей, окружающую среду.
Для управления безопасностью магистральных газопроводов использован ситуационный подход, предполагающий выявление проблемных ситуаций и выполнение различных преобразований имеющейся информации в управленческие решения, приводящие к их разрешению.
На основе обработанной информации построен алгоритм поиска возможного пути развития аварийной ситуации на магистральном газопроводе.
Выбраны технические средства реализации процесса поиска возможного пути развития аварийной ситуации на магистральном газопроводе.
На базе выбранного комплекса технических средств данный алгоритм реализован программно. Корректность работы программы проверена на контрольном примере.
Правила пользования разработанным программным средством приведены в инструкции по эксплуатации программы.
Разработанная программа позволяет оперативно прослеживать ход развития аварийной ситуации на магистральном газопроводе, определять вероятности достижения системой интересующих оператора состояний.
Библиографический список
-
Анализ аварий и несчастных случаев на трубопроводном транспорте России: учеб. пособие для вузов/ Под ред. Б.Е. Прусенко, В.Ф. Мартынюка. - М.: Анализ опасностей, 2003. - 351 с.
-
Андриянова М.А. Управление риском эксплуатации потенциально опасных объектов. Автореферат диссертации на соискание ученой степени кандидата технических наук. Тулу, ТулГУ, 1999.
-
Арсеньев Ю.Н., Бушинский В.И., Фатуев В.А. Принципы техногенной безопасности производств и построения систем управления риском. ТулГУ, Тула, 1994. - 111 с.
-
Бушинский В.И., Охинько В.А., Смолин С.А., Кузьмина Н.В. Исследование влияния управления персоналом на безопасность жизнедеятельности человека. Монография. Воронеж, 1999. - 310 с.
-
Гражданкин А.И., Дегтярев Д.В., Лисанов М.В., Печеркин А.С. Основные показатели риска аварии в терминах теории вероятностей // Безопасность труда в промышленности. - 2002. - №7. - с.35-39
-
Захаров В. Интеллектуальные технологии в современных системах управления // Проблемы теории и практики управления. - 2005. - №4. - с.2-10
-
Кульечев В.М., Иванов Е.А., Дадонов Ю.А., Мокроусов С.Н. Трубопроводный транспорт природного газа, нефти и нефтепродуктов и его роль в обеспечении развития и стабильности топливно-энергетического комплекса // Безопасность труда в промышленности. - 2002. - №7. - с.4-10
-
Мартынюк В.Ф., Прусенко Б.Е. Защита окружающей среды в чрезвычайных ситуациях. Москва, 2003.
-
Мокроусов С.Н. Пути повышения безопасности работы нефтегазового комплекса и систем магистрального трубопроводного транспорта // Безопасность труда в промышленности. - 2005. - №1. - с.18-20
-
Поспелов Д.А. Ситуационное управление: теория и практика. - М.: Наука, 1986. - 288 с.
-
Саати Т., Кернс К. Аналитическое планирование. Организация систем. М.: Радио и связь, 1991. - 216 с.
-
Управление безопасностью магистральных газопроводов / В.А. Фатуев, С.А. Васин, В.И. Бушинский, В.М. Митин, К.А. Морозов; Под ред. д. т. н., проф., академика МАНЭБ В.А. Фатуева; изд.2-е; ТулГУ, М.: Недра, 2000. - 144 с.
-
Фатуев В.А., Митин В.М., Морозов К.А., Югфельд А.С. Теоретические основы построения систем управления риском опасных производств. - Учебное пособие. Тула, Тульский государственный университет, 2000. - 179 с.
-
Фатуев В.А., Морозов К.А., Югфельд А.С., Шадрин А.А. Обеспечение надежности магистральных газопроводов. - Тула: Гриф и К, 2003. - 130 с.
-
Чекинов Г.П., Чекинов С.Г. Ситуационное управление: состояние и перспективы // Информационные технологии. - 2004. - №2. -Приложение
Приложение А
Текст программы управления безопасностью магистральных газопроводов:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Spin, ComCtrls;
const
word_max=100;
line_max=255;
colon=': ';
period='. ';
comma=',';
spase='';
equals='=';
nextrow=#13#10;
definite=100;
type
TMainForm = class (TForm)
Memo_Report: TMemo;
LE_Crash_Name: TLabeledEdit;
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
Bevel6: TBevel;
Bevel7: TBevel;
Label1: TLabel;
Label2: TLabel;
Bevel9: TBevel;
B_AddFact: TButton;
LE_AddFact_Frime: TLabeledEdit;
LE_AddFact_Value: TLabeledEdit;
LE_AddFact_Cf: TLabeledEdit;
B_TestFact: TButton;
LE_TestFact_Frime: TLabeledEdit;
LE_TestFact_Value: TLabeledEdit;
B_SeeFacts: TButton;
B_MakeFrimeMultivalid: TButton;
LE_MakeMulti_Frime: TLabeledEdit;
B_MakeLegal: TButton;
LE_MakeLegal_Frime: TLabeledEdit;
B_AddQuestion: TButton;
LE_AddQuestion_Frime: TLabeledEdit;
B_Answer: TButton;
LE_Answer_Frime: TLabeledEdit;
B_GetQuestion: TButton;
SE_Answer: TSpinEdit;
LE_Answer_Value: TLabeledEdit;
B_Answer_GetNumVals: TButton;
M_MakeLegal_Value: TMemo;
LE_AddQuestion_Value: TLabeledEdit;
LE_GetQuestion: TLabeledEdit;
B_GetTarget: TButton;
LE_GetTarget: TLabeledEdit;
Button1: TButton;
Bevel8: TBevel;
Button2: TButton;
Label3: TLabel;
procedure FormCreate (Sender: TObject);
procedure B_AddFactClick (Sender: TObject);
procedure B_TestFactClick (Sender: TObject);
procedure B_SeeFactsClick (Sender: TObject);
procedure B_MakeFrimeMultivalidClick (Sender: TObject);
procedure B_MakeLegalClick (Sender: TObject);
procedure B_AddQuestionClick (Sender: TObject);
procedure B_AnswerClick (Sender: TObject);
procedure B_GetQuestionClick (Sender: TObject);
procedure B_Answer_GetNumValsClick (Sender: TObject);
procedure LE_OnExit (Sender: TObject);
procedure M_MakeLegal_ValueExit (Sender: TObject);
procedure B_GetTargetClick (Sender: TObject);
procedure Button1Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
word_string=string [word_max] ;
line_string=string [line_max] ;
value_ptr=^value;
legal_ptr=^legal_value;
frime_ptr=^frime;
value=record // значение
name: word_string; // Имя
cert: integer; // коэффициент доверия
next: value_ptr; // указатель на след. значение
end;
legal_value=record // Допустимое значение
name: word_string; // Имя
next: legal_ptr; // Указатель на следующее допуст. значение
end;
frime=record // Фрейм
name: word_string; // имя
question: line_string; // атрибут ("вопрос")
question: line_string; // атрибут ("вопрос")
multivald: boolean; // флаг многозначности
legal_list: legal_ptr; // указатель на 1ый элемент списка допустимых значений
sought: boolean; // флаг "найденности"
value_list: value_ptr; // указатель на 1ый элемент списка значений ("ответ (ы)")
next: frime_ptr // указатель на следующий фрейм
end;
prem_ptr=^prem;
con_ptr=^con;
rule_ptr=^rule;
prem=record // Предпосылка
frime: word_string; // имя фрейма
value: word_string; // имя значение
next: prem_ptr; // указатель на следующую
end;
con=record // заключение
frime: word_string; // имя фрейма
value: word_string; // имя значения
cert: integer; // коэффициент доверия
next: con_ptr; // указатель на следующее
end;
rule=record // правило
name: word_string; // имя
prem: prem_ptr; // указатель на предпосылку
con: con_ptr; // указатель на заключение
next: rule_ptr; // указатель на следующее
end;
var
MainForm: TMainForm;
last_try, // результат последнего поиска
top_fact: frime_ptr; // указатель на начало списка фреймов-объктов
top_rule: rule_ptr; // указатель на начало списка правил
rulesFile: TextFile;
explain: boolean;
procedure make_node (var curr_frime: frime_ptr);
function find_frime (f_frime: word_string): frime_ptr;
procedure split (f_line: line_string; var f_frime,f_value: word_string);
function test (f_frime,f_value: word_string): value_ptr;
procedure add_frime (f_frime,f_value: word_string);
procedure see_vals (curr_frime: frime_ptr; cf_on: boolean);
procedure see_frimes (cf_on: boolean);
function get_cf (f_line: line_string): integer;
function blend (cf1,cf2: integer): integer;
procedure add_cf (f_frime,f_value: word_string; cf2: integer);
function ok_add (f_frime: word_string; cf: integer): boolean;
procedure make_multi (f_frime: word_string);
function find_word (f_line: line_string; n: integer; var _word: word_string): boolean;
procedure add_legal (f_legal: word_string; curr_frime: frime_ptr);
function find_legal (f_frime: word_string; n: integer; var _word: word_string): boolean;
procedure make_legals (m_line: word_string);
procedure make_legals_from_form (f_frime: word_string);
procedure add_question (f_frime,s_value: word_string);
function p_question (f_frime: word_string): line_string;
procedure ask (f_frime: word_string; var f_value: word_string);
procedure p_read (var oline: line_string);
function add_prem (curr_prem: prem_ptr; f_line: line_string): prem_ptr;
function add_con (curr_con: con_ptr; f_line: line_string): con_ptr;
procedure p_rule (curr_rule: rule_ptr);
procedure enter_rule (rule_name: word_string);
procedure LoadFormFile;
procedure SaveToFile;
function find_rule (fri: word_string; curr_rule: rule_ptr): rule_ptr;
procedure pursue (f_frime: word_string);
procedure q_result (f_frime: word_string);
procedure explain_how (curr_rule: rule_ptr);
procedure explain_why (f_frime: word_string);
implementation
{$R *. dfm}
procedure make_node;
var
head: frime_ptr;
begin
new (curr_frime);
head: =top_fact;
top_fact: =curr_frime;
with curr_frime^ do begin
next: =head;
value_list: =nil;
question: ='';
legal_list: =nil;
multivald: =false;
sought: =false;
end;
end;
function find_frime;
var
curr_frime: frime_ptr;
begin
if (last_try<>nil) and (last_try^. name=f_frime)
then begin
Result: =last_try;
exit;
end
else begin
curr_frime: =top_fact;
last_try: =nil;
Result: =nil;
while (curr_frime<>nil) and (Result=nil) do begin
if (curr_frime^. name=f_frime)
then begin
Result: =curr_frime;
Last_try: =curr_frime;
exit;
end;
curr_frime: =curr_frime^. next;
end;
end;
end;
procedure split;
var
st_left,
st_right: integer;
begin
st_right: =pos (period,f_line);
if st_right=length (f_line) then f_line: =copy (f_line,1,st_right-1);
st_left: =pos (equals,f_line);
st_right: =pos (comma,f_line);
if ( (st_left=0) and (st_right=0)) then f_frime: =f_line;
if (st_right=0) then st_right: =length (f_line) +1;
if st_left>0
then begin
f_frime: =copy (f_line,1,st_left-1);
if pos (') ',f_frime) =0
then f_value: =copy (f_line,st_left+1,st_right-st_left-1);
end;
st_right: =pos (') ',f_frime);
Приложение А (продолжение)
if st_right>0 then f_frime: =copy (f_line,1,st_right-1);
end;
function test (f_frime,f_value: word_string): value_ptr;
var
curr_frime: frime_ptr;
curr_value: value_ptr;
begin
curr_frime: =find_frime (f_frime);
Result: =nil;
if curr_frime<>nil
then begin
curr_value: =curr_frime^. value_list;
while (curr_value<>nil) do begin
if curr_value^. name= f_value
then Result: =curr_value;
curr_value: =curr_value^. next;
end;
end;
end;
procedure add_frime (f_frime,f_value: word_string);
var
curr_frime: frime_ptr;
value_list,head: value_ptr;
begin
curr_frime: =find_frime (f_frime);
if curr_frime=nil
then begin
make_node (curr_frime);
curr_frime^. name: =f_frime;
end;
curr_frime^. sought: = true;
value_list: =test (f_frime, f_value);
if value_list=nil
then begin
head: =curr_frime^. value_list;
new (value_list);
with value_list^ do begin
next: =head;
cert: =0;
name: =f_value;
end;
curr_frime^. value_list: =value_list;
end;
end;
procedure see_vals;
var
curr_value: value_ptr;
cf: integer;
bufStr: string;
begin
curr_value: =curr_frime^. value_list;
bufStr: =curr_frime^. name+equals;
if curr_value=nil
then bufStr: =bufStr+' He определено';
while (curr_value<>nil) do begin
bufStr: =bufStr+curr_value^. name;
if (cf_on=true)
then begin
cf: =curr_value^. cert;
bufStr: =BufStr+' (Кд='+IntToStr (cf) +') ';
end;
curr_value: =curr_value^. next;
if curr_value<>nil then bufStr: =BufStr+','+NextRow;
end;
MainForm. Memo_Report. Lines. Add (BufStr);
end;
procedure see_frimes (cf_on: boolean);
var
curr_frime: frime_ptr;
begin
MainForm. Memo_Report. Lines. Add ('');
MainForm. Memo_Report. Lines. Add ('Просмотр фактов базы знаний: ');
curr_frime: =top_fact;
while (curr_frime<>nil) do begin
see_vals (curr_frime,cf_on);
curr_frime: =curr_frime^. next;
MainForm. Memo_Report. Lines. Add ('');
end;
end;
function get_cf;
var
resultat,
st_right: integer;
trim: line_string;
begin
Result: =definite;
st_right: =pos (period,f_line);
if st_right=length (f_line)
then f_line: =copy (f_line, 1,st_right-1);
st_right: =pos ('Кд',f_line);
if (st_right>0) and (st_right+3 then begin trim: =copy (f_line,st_right+3,length (f_line) - st_right-2); val (trim,Result,resultat); if result>0 then Result: =definite; if pos ('Плохой',trim) >0 then Result: =25; if pos ('Средний',trim) >0 then Result: =50; if pos ('Хороший',trim) >0 then Result: =75; if pos ('Абсолютный',trim) >0 then Result: =definite; end; end; function blend; begin blend: = (100* (cf1+cf2) - (cf1*cf2)) div 100; end; procedure add_cf (f_frime,f_value: word_string; cf2: integer); var cf1: integer; curr_value: value_ptr; begin curr_value: =test (f_frime,f_value); cf1: =curr_value^. cert; curr_value^. cert: =blend (cf1,cf2); end; function ok_add; var curr_frime: frime_ptr; curr_value: value_ptr; is_100: boolean; begin is_100: =false; curr_frime: =find_frime (f_frime); if curr_frime<>nil then begin curr_value: =curr_frime^. value_list; while (curr_value<>nil) do begin if curr_value^. cert=definite then begin is_100: =true; break; end; curr_value: =curr_value^. next; end; end; Result: =not ( (cf=definite) and (is_100) and (not (curr_frime^. multivald))); end; procedure make_multi; var curr_frime: frime_ptr; begin curr_frime: =find_frime (f_frime); if curr_frime=nil then begin make_node (curr_frime); curr_frime^. name: =f_frime; end; curr_frime^. multivald: =true; end; function find_word; var x, com_place: integer; begin Result: =false; _word: =''; for x: =1 to n do begin com_place: =pos (comma,f_line); if com_place=0 then begin com_place: =length (f_line) +1; Result: =true; end; _word: =copy (f_line,1,com_place-1); f_line: =copy (f_line,com_place+1,length (f_line) - com_place); end; end; procedure add_legal; var curr_legal,head: legal_ptr; begin new (curr_legal); curr_legal^. next: =nil; curr_legal^. name: =f_legal; head: =curr_frime^. legal_list; if head<>nil then begin while (head^. next<>nil) do head^. next: =curr_legal; end else curr_frime^. legal_list: =curr_legal; end; function find_legal; var curr_frime: frime_ptr; curr_legal: legal_ptr; counter: integer; begin curr_frime: =find_frime (f_frime); Result: =true; if curr_frime<>nil then begin curr_legal: =curr_frime^. legal_list; _word: =curr_legal^. name; counter: =1; if curr_legal=nil then Result: =false; while (curr_legal<>nil) and (counter curr_legal: =curr_legal^. next; if curr_legal<>nil then begin _word: =curr_legal^. name; inc (counter); end else Result: =False; end; end else Result: =False; end; procedure make_legals; var curr_frime: frime_ptr; counter, st_place: integer; new_line: line_string; _word, f_frime, dummy: word_string; done: boolean; begin split (m_line,f_frime,dummy); curr_frime: =find_frime (f_frime); if curr_frime=nil then begin make_node (curr_frime); curr_frime^. name: =f_frime; end; st_place: =pos (equals,f_frime); new_line: =copy (f_frime,st_place+1,length (f_frime) - st_place); counter: =1; done: =false; while not done do begin done: =find_word (new_line,counter,_word); add_legal (_word,curr_frime); counter: =counter+1; end; end; procedure make_legals_from_form; var curr_frime: frime_ptr; i: integer; begin curr_frime: =find_frime (f_frime); if curr_frime=nil then begin make_node (curr_frime); curr_frime^. name: =f_frime; end; with MainForm. M_MakeLegal_Value do If Lines. Count>0 then for i: =0 to Lines. Count-1 do add_legal (Lines [i],curr_frime); end; procedure add_question; var curr_frime: frime_ptr; begin curr_frime: =find_frime (f_frime); if curr_frime=nil then begin make_node (curr_frime); curr_frime^. name: =f_frime; end; curr_frime^. question: =s_value; end; function p_question; var curr_frime: frime_ptr; begin curr_frime: =find_frime (f_frime); if curr_frime<>nil then begin if curr_frime^. question<>'' then Result: =curr_frime^. question else Result: ='Вопрос объекта пуст'; еnd else Result: ='Объект в базе не найден'; end; procedure ask; var pick, num_vals: integer; _word: word_string; begin if not find_legal (f_frime,1,_word) then begin MainForm. Memo_Report. Lines. Add ('Введите значение и нажмите кнопку "Выбрать"'); MainForm. B_Answer_GetNumVals. Enabled: =True; while MainForm. B_Answer_GetNumVals. Tag=0 do Application. ProcessMessages; MainForm. B_Answer_GetNumVals. Tag: =0; f_value: =MainForm. LE_Answer_Value. Text; // readln (f_value) end else begin num_vals: =1; with MainForm. Memo_Report. Lines do begin Add ('Допустимые значения объекта "'+f_frime+'": '); while find_legal (f_frime,num_vals,_word) do begin Add (IntToStr (num_vals) +'. '+_word); inc (num_vals); end; end; MainForm. SE_Answer. MaxValue: =num_vals-1; MainForm. Memo_Report. Lines. Add ('Выберите номер ответа и нажмите кнопку "Выбрать"'); MainForm. B_Answer_GetNumVals. Enabled: =True; while MainForm. B_Answer_GetNumVals. Tag=0 do Application. ProcessMessages; pick: =MainForm. SE_Answer. Value; // ord (select [1]) - 48; MainForm. B_Answer_GetNumVals. Tag: =0; find_legal (f_frime,pick,_word); f_value: =_word; end; end; procedure p_read; var c: char; len, counter, st_place: integer; supress: boolean; in_line: line_string; begin readln (RulesFile, in_line); in_line: =AnsiLowerCase (in_line); oline: =''; len: =length (in_line); st_place: =pos (' (', in_line); if st_place>0 then len: =st_place; supress: =false; for counter: =1 to len do begin c: =in_line [counter] ; if (c=equals) and (pos ('вопрос',oline) >0) then supress: =true; if ord (c) =9 then c: =' '; if (c<>'') or (supress=true) then oline: =concat (oline,c); end; end; function add_prem; var new_prem: prem_ptr; f_frime,f_value: word_string; begin split (f_line,f_frime,f_value); add_prem: =curr_prem; new (new_prem); with new_prem^ do begin frime: =f_frime; value: =f_value; next: =nil; end; if curr_prem=nil then add_prem: =new_prem else begin while (curr_prem^. next<>nil) do curr_prem: =curr_prem^. next; curr_prem^. next: =new_prem; end; end; function add_con (curr_con: con_ptr; f_line: line_string): con_ptr; var new_con: con_ptr; f_frime, f_value: word_string; begin split (f_line,f_frime,f_value); add_con: =curr_con; new (new_con); with new_con^ do begin frime: =f_frime; value: =f_value; cert: =get_cf (f_line); next: =nil; end; if curr_con=nil then