Реферат: Разработка диалоговой системы, оформленной в виде пакета прикладных программ и реализующей идею искусственного интеллекта

1.Задание на лабораторную работу

Разработать диалоговую систему, оформленную в виде пакетаприкладных программ и реализующую идею искусственного интеллекта. Для этогонеобходимо:

* Самостоятельно выбрать предметную областьинтеллектуального пакета

* Для выбранной предметной области описать семантическуюсеть и правила вывода (базу знаний)

* Разработать блоки системной части пакета, реализующие:

* машину логического вывода

* процедуры работы с семантической сетью

* Подготовить отладочные варианты наборов данных

* Провести машинный эксперимент

* Описать полученные результаты

2.Руководство пользователя

2.1. Назначение программы

      В качествепредметной области была выбрана кулинария.

Программа предназначена для получения информации осоставе различных кулинарных блюд. Пользователю предоставляется возможностьперечислить несколько ингредиентов и получить информацию о том, что из этогонабора можно приготовить, или ввести интересующее блюдо и узнать из чего оносостоит, или ввести как ингредиенты так и готовый продукт и узнать достаточноли введенных компонент для приготовления выбранного блюда.

     Программапозволяет корректировать имеющуюся базу знаний и создавать новую. Корректировказаключается в добавлении и удалении знаний и фактов.  Но в целях соблюдения целостности базы знанийпрограмма не позволит удалить некоторые знания и факты. Если факт  входит в состав знания, то его удалениеповлечет нарушение целостности базы. Программа предложит сначала удалитьзнания, в которые входит этот факт, а потом уже сам факт.

2.2.Описание базы знаний

          

База знанийФакты (декларативные знания)Правила(процедурные знания)

Декларативные знания

Числовой кодЗначение12 яйца23 яйца34 яйца4100 грамммолока5200 грамм молока6400 грамм молока70,5 ложки соли81 ложка соли92 ложкисоли101 стакан муки112 стакана муки124 стакана муки1310 ложек сахара1413 ложексахара1515 ложек сахара16Изюм17Дорожжи18Творог19Омлет на 1-го человека20Омлетна 2-х человек21Опара22Тесто23Блины24Яичница на 1-го человека25Яичница на 2-хчеловек26Кулич27Ватрушка28Жарить29Печь

Процедурные знания

Код порождаемого фактаКоличество

свидетельствСвидетельства1941,4,7,282043,5,8,282145,9,11,1722521,3,4,12,1523222,282431,7,282533,8,2826322,16,2927322,18,29

2.3. Описание диалога

Данная программа построена по принципу диалога спользователем, что обеспечивает удобство и психологический комфорт при работе сней.

После запуска программы появляется стандартноеwindows-окно — в данном случае главное окно, приглашающее вас к работе. Данноеокно содержит картинку, располагающую вас к приятной реализации программногопродукта, и меню из трех пунктов: Главное меню, содержащее подпункты: Работа ссистемой и Выход, «Помощь» и  Опрограмме.  Выбрав Работа с системой, выне только узнаете о ее названии и версии, но и о создателях таковой. Выборможно осуществлять кроме мыши с помощью сочетания клавиш (Alt + соответствующаябуква). Нажав меню Работа с системой, вы окажитесь в окне CulinaryMiracles гдевам будет представлены следующие возможности системы: Правка, Работа, Выход.Ознакомившись с пунктом Помощь, в котором содержится общая информация поданному программному продукту, вы смело можете приступать к реализации основныхдействий.

При выборе Работа с системой  появится рабочее окно, где вам будетпредложены имеющиеся факты и цели исходной базы знаний. Теперь все в вашихруках. Данная программа предоставляет три варианта реализации ее возможностей.Во-первых, вы можете выбрать интересующие вас факты и спросить у системы, чтоможно из них приготовить, во-вторых, выбрать желаемые цели и запросить, какиефакты необходимы для их реализации, и наконец в-третьих, выбрать и факты ицели, а затем система выдаст сообщение о том, что все в порядке либо подскажетвам какие из выбранных фактов оказались лишними, а каких не хватает. Вышеперечисленные действия реализуются легко и просто с помощью кнопок: добавитьфакт/цель в список выбранных фактов/целей — "(", удалить факт/цель изсписка выбранных фактов/целей — "(" и запуск на выполнение«OK». Для выполнения последующих запросов вам необходимо нажатькнопку «Сброс». 

Для модернизации возможностей «CulinaryMiracles» воспользуйтесь пунктом Правка, где вам будут представлены факты,снабженные информацией, то есть, простой ли это факт или порождаемый факт ссодержащимися в нем свидетельствами. В данном пункте меню вы можете не толькодобавить или удалить факты исходной базы знаний, но и сохранить измененную(новую) базу в файл, а также открыть любую из предложенных.

 Все компонентыпрограммы снабжены помощью, подсказками, что облегчает работу пользователя,как-то: сообщения о допущенных ошибках, запрос системы о том, действительно ливы хотите совершить то или иное действие и т.д. Окончив работу, вы покидаетесистему с помощью пункта Выход или другими стандартными способами Windows.

 

2.4. Описание работа машинного логического вывода

2.4.1. Описание стратегии

     Стратегияреализации поставленной задачи  разбитана 3 возможных варианта желаний пользователя. Все зависит от того, чтопользователь введет: только факты (компоненты), только знания (блюда), и фактыи знания. Система сама распознает, какой вариант введен и пойдет понужному  пути.

Случай 1. Введены только факты. В данном случае системазадействует алгоритм планирования с прямым ходом.  Если хоть один целевой факт (т.е. съедобноеблюдо) достижим, то программа покажет, что именно. Результатом может статьтолько одно блюдо. Т.е. на неимеющее смысла перечисление всех ингредиентов,программа скромно выдаст только одно блюдо.

Случай 2. Введены только знания. В этом случае программа задействует  алгоритм планирования с обратным ходом. Можноввести как одно, так и несколько блюд, и программа выдаст все ингредиенты  для интересующих знаний.

Случай 3. Введены и факты и знания. В этом случае системаанализирует, что необходимо для введеных знаний, потом какие необходимые фактыввел пользователь и в заключении сообщает какие факты лишние, а какихнедостает.

2.4.2. Прямое планирование

 

Подготовка: обнуление различных ключей и счетчиков.

Цикл на организацию обработки базы знаний до тех пор,пока не будет получено первое целевое значение или не станет ясна невозможностьего получения.

Цикл на просмотр всех правил до порождения целевогофакта.

.Внутри этого цикла осуществляется проверка на     необходимость порождения правила ивозможность порождения правила. Если и то и то подтверждается, то порождаетсяфакт (правило), и если этот факт целевой, то обработка заканчивается и этотфакт запоминается, иначе переход к следующему правилу.

. Конец цикла.

Конец алгоритма, если был порожден целевой факт, то выдача результата на экран, иначе выдачасообщения о невозможности  приготовленияни одного блюда из предложенных компонентов.

Алгоритм прямого планирования реализован  в процедуре Direct.

2.4.3. Обратное планирование

   

Подготовка: обнуление различных ключей и счетчиков.

Цикл на просмотр всех введенных пользователем правил.Занесение этого значения в специальный массив.

Цикл на разложение каждого введенного пользователемправила на простые компоненты. Все компоненты (факты и знания)  заносятся в специальный массив, который  анализируется на наличие  в нем правил. Если правило найдено, то егоразлагают на более простые составляющие, и так то тех пор, пока от введенного  правила останутся только простые факты.

Конец  цикла.Переход к следующему введенному правилу.

Конец алгоритма. Выдача результатов на экран.

Алгоритм прямого планирования реализован  в процедуре Inv.

2.5.Примеры реализации основных функций пользователя

     

Задание фактов и получение цели

Задание целей и получение фактов

Задание фактов и целей и получение информации о лишних инедостающих фактах

Задание фактов и целей и получение положительногосообщения системы

Добавление факта в базу

3.Описание программы

3.1. Общие свойства

Любая программа в интегрированной среде разработкиприложений Delphi 4 состоит из файла проекта (файл с расширением dpr) инескольких модулей (файлы с расширением pas), каждый из которых описываетпрограммную единицу Object Pascal. Файл проект представляет собой программу,написанную на языке Object Pascal и предназначенную для обработки компилятором.Эта программа автоматически создается Delphi, содержит лишь несколько строк ине предназначена для редактирования.

Данная программа написана с помощью инструментапрограммирования  Delphi 4 и состоит изфайла проекта CulinaryMiraclesи трех модулей: Culinary.pas, About.pas,Help.pas.

3.2. Логическая структура программы

     Так как языкпрограммирования Object Pascal — это объектно-ориентированный язык, тоотобразить  схематично многообразиепроцедур — обработчиков событий нажатий на многочисленные кнопки, вызовов менюи прочее не позволяет лист бумаги. Так что логическая структура отображаеттолько модули работы системы по обработке введенных данных, добавлению иудалению фактов, сохранению и открытию базы знаний.

3.3.Описание функций модулей

1procedure FormActivate Задание начальных параметров,загрузка базы знаний Base.dat2.

2procedure Timer1Timer Обеспечивает бегущие надписи призаставке3. 3procedure N6ClickОбработчик вызова меню О программе4.

4procedure N2ClickОбработчик вызова меню Работа ссистемой5.

5Procedure SpeedButton3ClickОбработчик нажатия кнопкиВыход, выход из программы6.

6Procedure SpeedButton1ClickОбработчик нажатия кнопкиПравка7.

7Procedure SpeedButton8ClickОбработчик нажатия кнопкиВозврат, возврат в главное меню8.

Procedure SpeedButton2ClickОбработчик нажатия кнопкиРабота, появления окна для выбора фактов и знаний9.

procedure N7ClickОбработчик вызова пункта Возврат в окневыбора фактов

procedure BitBtn1ClickЗанесение фактов в окошко«Выбранные факты»11.

Procedure BitBtn3ClickЗанесение фактов в окошко«Выбранные цели»12.

Procedure BitBtn5ClickОбработчик нажатия кнопки ОК,обработка введеных данных, выдача резльтатов13.

Procedure BitBtn6ClickОбработчик нажатия кнопки Сброс, обнулениесчетчиков14. Procedure Timer2TimerОбеспечивает выплывание надписи ОК!15.

Procedure LoadBaseПроцедура открытия новой базы16.

procedure SaveBaseПроцедура сохранения текущей базы17.

Procedure SpeedButton6ClickОбработчик нажатия кнопкиОткрыть БЗ, выдача соответствующего диалогового окна18.

Procedure SpeedButton7ClickОбработчик нажатия кнопкиСохранить как, выдача соответствующего диалогового окна19.

procedure ListBox1ClickОтображение  фактов в окне «Имеющиеся факты»20.

Procedure SpeedButton4Click Обработчик нажатия кнопкиДобавить, отображение окошка для добавления в БЗ фактов21.

Procedure SpeedButton10ClickОбработчик нажатия кнопкиОтмена в окошке для добавления фактов, возврат в окно Правка22.

Procedure RadioGroup1ClickОбработчик выбора типа факта вокне добавления фактов23.

procedure AddSimpleFactПроцедура добавления простогофакта24.

Procedure SpeedButton9ClickОбработчик нажатия кнопки ОК вокошке для добавления фактов, вызов процедуры AddSimpleFact25.

Procedure SpeedButton11ClickОбработчик нажатия кнопкиДобавить при добавлении фактов в БЗ, эта кнопка добавляет факты в знание приего определении26. Procedure AddComplexFactПроцедура добавления правила27.

procedure DeleteFactПроцедура удаления факта28.

Procedure SpeedButton5ClickОбработчик нажатия кнопкиУдалить29.

Procedure BitBtn2ClickУдаление фактов в окне«Выбранные факты»30.

procedure BitBtn4ClickУдаление фактов в окне«Выбранные цели»31.

procedure N5ClickВызов пункта меню Помощь, появление окнаПомощь32.

procedure N4ClickВызов пункта меню Выход, выход изпрограммы

4.Список литературы

1. В.А.Благодатских, С.Н.Семенов, А.М.Хамов. Лабораторныйпрактикум по прикладному и системному программированию.- М.: Финансы истатистика, 1985.

2. Фаронов В.В. Delphi4, учебный курс. — М.:«Нолидж»,1999.

3. В.А. Благодатских, М.А. Енгибарян, Е.В. Ковалевская.Экономика, разработка и использование программного обеспечения ЭВМ. — М.: Финансы и статистика, 1995.

4. Роб Баас, Майк Фервай. Delphi 4 Полное руководство — Киев, издательская группа BHV, 1999.

 

5.Приложения

5.1.Листинги программы

unit Culinary;

interface

uses

  Windows, Messages, SysUtils, Classes,Graphics, Controls, Forms, Dialogs,

  ExtCtrls, StdCtrls, jpeg, Menus, Buttons;

type

  TForm1 = class(TForm)

    Image1: TImage;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Timer1: TTimer;

    MainMenu1: TMainMenu;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    N6: TMenuItem;

    SpeedButton1: TSpeedButton;

    SpeedButton2: TSpeedButton;

    SpeedButton3: TSpeedButton;

    ListBox1: TListBox;

    ListBox2: TListBox;

    Label4: TLabel;

    Label5: TLabel;

    Bevel1: TBevel;

    Bevel2: TBevel;

    SpeedButton4: TSpeedButton;

    SpeedButton5: TSpeedButton;

    SpeedButton6: TSpeedButton;

    SpeedButton7: TSpeedButton;

    SpeedButton8: TSpeedButton;

    Bevel3: TBevel;

    ListBox4: TListBox;

    ListBox5: TListBox;

    ListBox6: TListBox;

    BitBtn1: TBitBtn;

    BitBtn2: TBitBtn;

    BitBtn3: TBitBtn;

    BitBtn4: TBitBtn;

    Label7: TLabel;

    Label8: TLabel;

    Label9: TLabel;

    Label10: TLabel;

    Bevel4: TBevel;

    Bevel5: TBevel;

    N7: TMenuItem;

    BitBtn5: TBitBtn;

    ComboBox1: TComboBox;

    ComboBox2: TComboBox;

    Label11: TLabel;

    Label12: TLabel;

    BitBtn6: TBitBtn;

    Label13: TLabel;

    Timer2: TTimer;

    ListBox3: TListBox;

    OpenDialog1: TOpenDialog;

    SaveDialog1: TSaveDialog;

    Bevel6: TBevel;

    Bevel7: TBevel;

    Label6: TLabel;

    ComboBox3: TComboBox;

    Edit1: TEdit;

    RadioGroup1: TRadioGroup;

    Panel1: TPanel;

    SpeedButton9: TSpeedButton;

    SpeedButton10: TSpeedButton;

    Label14: TLabel;

    Label15: TLabel;

    SpeedButton11: TSpeedButton;

    procedure FormActivate(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

    procedure N6Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure SpeedButton3Click(Sender:TObject);

    procedure SpeedButton1Click(Sender:TObject);

    procedure SpeedButton8Click(Sender:TObject);

    procedure SpeedButton2Click(Sender:TObject);

    procedure N7Click(Sender: TObject);

    procedure BitBtn1Click(Sender: TObject);

    procedure BitBtn3Click(Sender: TObject);

    procedure BitBtn5Click(Sender: TObject);

    procedure BitBtn6Click(Sender: TObject);

    procedure Timer2Timer(Sender: TObject);

    procedure LoadBase;

    procedure SaveBase;

    procedure SpeedButton6Click(Sender:TObject);

    procedure SpeedButton7Click(Sender:TObject);

    procedure ListBox1Click(Sender: TObject);

    procedure SpeedButton4Click(Sender:TObject);

    procedure SpeedButton10Click(Sender:TObject);

    procedure RadioGroup1Click(Sender:TObject);

    procedure AddSimpleFact;

    procedure SpeedButton9Click(Sender:TObject);

    procedure SpeedButton11Click(Sender:TObject);

    procedure AddComplexFact;

    procedure DeleteFact;

    procedure SpeedButton5Click(Sender:TObject);

    procedure BitBtn2Click(Sender: TObject);

    procedure BitBtn4Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure N4Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

   TFactFile = record      {факт}

         Number:integer; {номерфакта}

         Znach:string[40]; {значениефакта}

        Q:integer;      {количествопорождаемых фактов}

         FactIn:array[1..10] of integer; {массивпорождаемыхфактов}

         Zel:byte;{Целевой или нецелевойфакт}

         end;

  TKnow = Record     {порождаемыйфакт}

         Number:integer;   {номер порождаемого факта}

         Q:integer;{количество порождаемых фактов}

         FactIn:array[1..10] of integer; {массивпорождаемыхфактов}

         Zel:byte;

        end;

  TFact= record      {факт}

         Number:integer; {номерфакта}

         Znach:string[40]; {значениефакта}

         end;

  TBase=Record

      Fact:array[1..40] of integer;

      Rule:array [1..40] of TKnow;

      end;

  TFF=file of TFactFile;

var

  Form1: TForm1;

  FF:TFF;

  TermFact:array[1..50] of integer; {массивc темчтохотимиметьнавыходе}

  NE,NK,NF,NF1,NFF,NR,KEND,Rez,NST,Num:integer;

  Spis:array[1..30] of integer; {необходимыефактыдляцели}

  SpisF:array[1..30] of integer; {выбранныефакты}

  BaseKnow:TBase;

  Knowledge:array[1..5] of integer; {массивсвыбраннымиправилами}

  VectFact:array[1..50] of TFact; {базафактов}

implementation

usesAbout, Help;

{$R*.DFM}

procedureTForm1.FormActivate(Sender: TObject);

var

   Know:TKnow;

   Fact:TFact; FactFile:TFactFile;

   i,j:integer;

begin

     NF:=0;NF1:=0;NK:=0;

     AssignFile(FF,'Base.dat'); {Файлсфактами}

     Reset(FF);

     NFF:=0;

     While Not eof(FF) do

     begin

          Read(FF,FactFile);

          NFF:=NFF+1;

         VectFact[NFF].Number:=FactFile.Number;

          VectFact[NFF].Znach:=FactFile.Znach;

         ListBox1.Items.Add(VectFact[NFF].Znach);

         ListBox3.Items.Add(VectFact[NFF].Znach);

          if FactFile.Q>1 then

          begin

              NR:=NR+1;

             BaseKnow.Rule[NR].Number:=FactFile.Number;

             BaseKnow.Rule[NR].Zel:=FactFile.Zel;

             ListBox5.Items.Add(FactFile.Znach);

              BaseKnow.Rule[NR].Q:=FactFile.Q;

              for i:=1 to BaseKnow.Rule[NR].Qdo

              BaseKnow.Rule[NR].FactIn[i]:=FactFile.FactIn[i];

          end;

    end;

    closefile(FF);

   

end;

procedureTForm1.Timer1Timer(Sender: TObject);

begin

label1.top:=label1.top-2;

label2.left:=label2.left+4;

label3.top:=label3.top+2;

iflabel2.left=100 then

 timer1.Enabled:=false;

end;

procedureTForm1.N6Click(Sender: TObject);

begin

AboutBox.Show;

end;

procedureTForm1.N2Click(Sender: TObject);

begin

N1.Visible:=false;

N2.Visible:=false;

N3.Visible:=false;

N4.Visible:=false;

{N5.Visible:=false;

N6.Visible:=false;}

label1.Visible:=false;

label2.Visible:=false;

label3.Visible:=false;

form1.Height:=150;

form1.Width:=185;

form1.BorderStyle:=bsDialog;

form1.Position:=poScreenCenter;

speedbutton1.Visible:=true;

speedbutton2.Visible:=true;

speedbutton3.Visible:=true;

end;

procedureTForm1.SpeedButton3Click(Sender: TObject);

begin

close;

end;

procedureTForm1.SpeedButton1Click(Sender: TObject);

begin

form1.Height:=343;

form1.Width:=450;

form1.BorderStyle:=bsSingle;

form1.Position:=poScreenCenter;

speedbutton1.Visible:=false;

speedbutton2.Visible:=false;

speedbutton3.Visible:=false;

speedbutton4.Visible:=true;

speedbutton5.Visible:=true;

speedbutton6.Visible:=true;

speedbutton7.Visible:=true;

speedbutton8.Visible:=true;

listbox1.Visible:=true;

listbox2.Visible:=true;

bevel1.Visible:=true;

bevel2.Visible:=true;

bevel3.Visible:=true;

bevel3.Width:=430;

label4.Visible:=true;

label5.Visible:=true;

label6.Visible:=true;

end;

procedureTForm1.SpeedButton8Click(Sender: TObject);

begin

form1.Height:=150;

form1.Width:=185;

form1.BorderStyle:=bsDialog;

form1.Position:=poScreenCenter;

speedbutton1.Visible:=true;

speedbutton2.Visible:=true;

speedbutton3.Visible:=true;

speedbutton5.Visible:=false;

speedbutton6.Visible:=false;

speedbutton7.Visible:=false;

speedbutton8.Visible:=false;

listbox1.Visible:=false;

listbox2.Visible:=false;

bevel1.Visible:=false;

bevel2.Visible:=false;

bevel3.Visible:=false;

bevel3.Width:=481;

label4.Visible:=false;

label5.Visible:=false;

label6.Visible:=false;

panel1.Visible:=false;

edit1.Visible:=false;

combobox3.Visible:=false;

radiogroup1.Visible:=false;

speedbutton11.visible:=false;

end;

procedureTForm1.SpeedButton2Click(Sender: TObject);

begin

form1.Height:=343;

form1.Width:=503;

form1.BorderStyle:=bsSingle;

form1.Position:=poScreenCenter;

speedbutton1.Visible:=false;

speedbutton2.Visible:=false;

speedbutton3.Visible:=false;

BitBtn5.Visible:=true;

BitBtn6.Visible:=true;

bevel3.Visible:=true;

bevel4.Visible:=true;

bevel5.Visible:=true;

bevel6.Visible:=true;

bevel7.Visible:=true;

ListBox3.Visible:=true;

ListBox4.Visible:=true;

ListBox5.Visible:=true;

ListBox6.Visible:=true;

label7.Visible:=true;

label8.Visible:=true;

label9.Visible:=true;

label10.Visible:=true;

label11.Visible:=true;

label12.Visible:=true;

ComboBox1.Visible:=true;

ComboBox2.Visible:=true;

BitBtn1.Visible:=true;

BitBtn2.Visible:=true;

BitBtn3.Visible:=true;

BitBtn4.Visible:=true;

N7.Visible:=true;

end;

procedureTForm1.N7Click(Sender: TObject);

begin

form1.Height:=150;

form1.Width:=185;

form1.BorderStyle:=bsDialog;

form1.Position:=poScreenCenter;

speedbutton1.Visible:=true;

speedbutton2.Visible:=true;

speedbutton3.Visible:=true;

BitBtn5.Visible:=false;

BitBtn6.Visible:=false;

bevel3.Visible:=false;

bevel4.Visible:=false;

bevel5.Visible:=false;

bevel6.Visible:=false;

bevel7.Visible:=false;

ListBox3.Visible:=false;

ListBox4.Visible:=false;

ListBox5.Visible:=false;

ListBox6.Visible:=false;

label7.Visible:=false;

label8.Visible:=false;

label9.Visible:=false;

label10.Visible:=false;

BitBtn1.Visible:=false;

BitBtn2.Visible:=false;

BitBtn3.Visible:=false;

BitBtn4.Visible:=false;

N7.Visible:=false;

label11.Visible:=false;

label12.Visible:=false;

ComboBox1.Visible:=false;

ComboBox2.Visible:=false;

BitBtn6Click(Sender);

end;

procedureTForm1.BitBtn1Click(Sender: TObject);

var

  rab:integer;

begin

  rab:=ListBox3.itemindex;

  listbox4.Items.Add(VectFact[rab+1].Znach);

  NF1:=NF1+1;

  SpisF[NF1]:=VectFact[rab+1].Number;

  BaseKnow.Fact[NF1]:=VectFact[rab+1].Number;

  NF:=NF1;

end;

procedureTForm1.BitBtn3Click(Sender: TObject);

varrab,i,j:integer;

begin

  rab:=ListBox5.itemindex;

  for i:=1 to NFF do

    ifBaseKnow.Rule[rab+1].Number=VectFact[i].Number then

    begin

      listbox6.Items.Add(VectFact[i].Znach);

      NK:=NK+1;

      Knowledge[NK]:=VectFact[i].Number;

    end;

end;

ProcedureDirect;

var

    KIZ,NS,KA,k,i,l,j:integer;

begin

    {Теперьалгоритм прямого хода}

    KEnd:=0;KIZ:=0;NS:=0;

     While ((KEnd=0) and (KIZ=0)) do

     begin

       {организация обработки БЗ до тех пор, пока не получим}

        {требуемоецелевое значение или не станет ясна }

       {невозможность его получения}

         KIZ:=1;

         i:=1;

         While (i<=NR) and (Kend=0) do

         begin

            {Просмотр всех правил до порождения}

            {целевого факта}

             KA:=0;{Проверка: нужно ли порождать факт?}

             k:=1;

             While ((KA=0) and (K<=NF)) do

             begin

                 ifBaseKnow.Rule[i].Number=BaseKnow.Fact[k] then

                   KA:=1; {Факт входит вмножество имеющихся}

                k:=k+1;

             end;

            {Проверка: можно ли породить факт?}

             j:=1;

             While ((j<=BaseKnow.Rule[i].Q)and (KA=0)) do

             begin

                 {Анализ порождающих фактов}

                 KA:=1; k:=1;

                  While (k<=NF) and (KA=1) do

                  begin

                      {Проверка наличия порождающего факта}

                      {есть ли факт в БЗ}

                      ifBaseKnow.Rule[i].FactIn[j]=BaseKnow.Fact[k] then

                          KA:=0;

                      k:=k+1;

                  end;

                 {если при выходе КА=1, то нет факта,}

                 {необходимого для порождения}

                 j:=j+1;

             end;

             if KA=0 then

             begin

                  {Все факты, необходимыедля порождения}

                 {нового факта, есть в наличие}

                  NF:=NF+1;

                 BaseKnow.Fact[NF]:=BaseKnow.Rule[i].Number;

                  KIZ:=0;

                      {Проверка: является ля порожденный факт}

                       {целевым}

                       ifBaseKnow.Rule[i].Zel=1 then

                         begin

                             KEND:=1;

                            Rez:=BaseKnow.Rule[i].Number;

                         end;

             end;

            i:=i+1;

         end;

         {Конец очередного просмотравсех правил}

         {Конецобработки БЗ}

     end;

end;

ProcedureInv;

var

   KVPC,KVPF,AnFact,NS1,Rab,FindFactAn:integer;

    L,NS,i,j,k,KA:integer;

begin

       {Алгоритмобратного хода}

     KEnd:=0;L:=1;   NST:=0;

     While (L<=NK) do

     begin

          {Организация просмотра всехцелевых}

          {фактов,пока не подтвердится возможность}

         {порождения каког-л. из них}

          KEND:=0;

          Nst:=Nst+1;

          Spis[Nst]:=Knowledge[l];

          While (Kend=0)do

          begin

               FindFactAn:=0;

               j:=0;

               While (FindFactAn=0)and(j<=NST) do  {выборфактадляанализа}

               begin

                 for  k:=1 to NR do

                    ifBaseKnow.Rule[k].Number=Spis[j]

                      then

                       begin

                         FindFactAn:=1;         {Ищем, естьлиправило}

                         AnFact:=Spis[j];       {котороеможнопородить}

                         for i:=j to Nst-1 do

                           Spis[i]:=Spis[i+1];

                         Nst:=Nst-1;

                       end;

                 j:=j+1;

               end;

               if FindFactAn=0 then

                 KEnd:=1        {Факта для анализа нет, конец анализа}

               else

               begin

                  i:=1;

                  While (I<=NR) do

                  begin

                     {анализ возм-ти  порождения}

                     {выбранного факта}

                     if AnFact=BaseKnow.Rule[i].Number then

                     begin

                        {требуемый факт является порожденным}

                         for j:=1 to BaseKnow.Rule[i].Q do

                         begin

                              NST:=NST+1;

                             Spis[Nst]:=BaseKnow.Rule[i].FactIn[j];

                         end;

                     end;{конец анализа порождаемого факта}

                     i:=i+1;

                  end;{While }

               end;

          end;

         l:=l+1;

     end;{Окончаниеобработки всех целевых фактов}

     if NST=NK thenKEND:=0 else KEND:=1;

     {Ни один изцелевых фактов не может быть порожден}

end;

procedure TForm1.BitBtn5Click(Sender: TObject);  {нажали кнопку ОК}

var

  i,j,k,KA,l:integer;

begin

   BitBtn5.enabled:=false;

    if(NF1<>0) and (NK=0) then    {фактывведены, цель не введена}

      begin

         Direct;

         ifKend<>0 then

           begin

             fori:=1 to NFF do

               ifVectFact[i].Number=Rez then

                ListBox6.Items.Add(VectFact[i].Znach);

            Label10.Caption:='Вы приготовите:';

            Label10.Font.Color:=clnavy;

           end

           else

          Application.MessageBox('Из выбранных компонентов ничего нельзяприготовить!','Ошибка!',mb_iconwarning);

      end;

    if (NF1=0) and(NK<>0) then {факты не введены, цель введена}

    begin

        Inv;

        ifKEnd<>0 then

          begin

            fori:=1 to NST do

              forj:=1 to NFF do

                ifSpis[i]=VectFact[j].Number then

                  ListBox4.Items.Add(VectFact[j].Znach);

            Label8.Caption:='Вам необходимо:';

            Label8.Font.Color:=clnavy;

          end;

    end;

    if(NK<>0) and (NF1<>0) then {анализ на совпадение фактов с целью}

    begin

      k:=1;

        While(k<=NR) do

         begin             {Если естьпорождаемые факты}

              i:=1;     {то раскладываем их напростые составляющие}

               KA:=0;

              While (i<=NF1)and (KA=0) do

              begin

                  if BaseKnow.Rule[k].Number=SpisF[i] then

                     begin

                         for j:=i to NF1-1 do

                            SpisF[j]:=SpisF[j+1];

                         NF1:=NF1-1;

                         KA:=1;

                     end;

                  i:=i+1;

               end;

               ifKA=1 then

              begin

                  for i:=1 to BaseKnow.Rule[k].Q do

                   begin

                        NF1:=NF1+1;

                        SpisF[NF1]:=BaseKnow.Rule[k].FactIn[i];

                   end;

                   k:=0;

               end;

               k:=k+1;

          end;

          INV;

          i:=1;

          Whilei<=NF1 do   {Проверка, что лишнее}

         begin             {или чего нехватает}

              KA:=0;

              j:=1;

              While (j<=NST) and (KA=0) do

              begin

                   if SpisF[i]=Spis[j] then

                      Ka:=1;

                   j:=j+1;

               end;

               ifKA=1 then

              begin

                   for k:=i to NF1-1 do

                     SpisF[k]:=SpisF[k+1];

                   i:=i-1;

                   NF1:=NF1-1;

                   for l:=j-1 to NST-1 do

                     Spis[l]:=Spis[l+1];

                   NST:=Nst-1;

               end;

              i:=i+1;

          end;

        if(Nst=0)and (NF1=0) then

           Timer2.Enabled:=trueelse

           begin

               KA:=0;

                fori:=1 to NST do

                 for j:=1 to NFF do

                 begin

                   if (Spis[i]=VectFact[j].Number) and (KA=0)  then

                     begin

                       combobox2.Text:=VectFact[j].Znach;

                       KA:=1;

                     end;

                   if (Spis[i]=VectFact[j].Number) and (KA=1)  then

                      combobox2.Items.Add(VectFact[j].Znach);

                  end;

               KA:=0;

                fori:=1 to NF1 do

                 for j:=1 to NFF do

                 begin

                   if (SpisF[i]=VectFact[j].Number) and (KA=0) then

                     begin

                        combobox1.Text:=VectFact[j].Znach;

                        KA:=1;

                     end;

                   if (SpisF[i]=VectFact[j].Number) and (KA=1) then

                     combobox1.Items.Add(VectFact[j].Znach);

                 end;

           end;

    end;

    if (Nk=0) and(NF1=0) then

     begin

      Application.MessageBox('Исходные данные невведены!','Ошибка',mb_iconwarning);

      BitBtn5.Enabled:=true;

     end;

end;

procedure TForm1.BitBtn6Click(Sender: TObject);

begin

  listbox4.Items.Clear;

 listbox6.Items.Clear;

 label10.Caption:='Выбранные цели';

 label8.Caption:='Выбранные факты';

 Label10.Font.Color:=cllime;

 Label8.Font.Color:=cllime;

  NK:=0;

  NF1:=0;

 label13.Visible:=false;

  label13.Top:=104;

  ComboBox1.Clear;

  ComboBox2.Clear;

 BitBtn5.enabled:=true;

end;

p

еще рефераты
Еще работы по программному обеспечению