Sidebar






Old

courses:knowledge_base_and_expert_system:lab1

This is an old revision of the document!


Лабораторная работа №1: Изучение системы программирования Visual Prolog. Создание Пролог-программы с графическим интерфейсом

Цель работы

Изучение системы программирования Visual Prolog с последующим созданием Пролог-программы с графическим интерфейсом.

Основные теоретические положения

Visual Prolog – объектно-ориентированное расширение языка программирования PDC Prolog, развивавшегося из Turbo Prolog (Borland), семейства Prolog, а также система визуального программирования датской фирмы Prolog Development Center.

Visual Prolog автоматизирует построение сложных процедур и освобождает программиста от выполнения тривиальных операций. С помощью Visual Prolog проектирование пользовательского интерфейса и связанных с ним окон, диалогов, меню, строки уведомлений о состояниях и т. д. производится в графической среде. С созданными объектами могут работать различные Кодовые Эксперты (Code Experts), которые используются для генерации базового и расширенного кодов на языке Prolog, необходимых для обеспечения их функционирования.

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

Язык программирования, реализованный в Visual (а ранее в Turbo) Prolog'е отличается от классического пролога тем, что он основан на строгой статической типизации. В него также добавлены средства объектно-ориентированного программирования, анонимные предикаты (лямбда-предикаты), факты-переменные и разрушающее присваивание для них, аргументы-домены (Generic Interfaces and Classes) и параметрический полиморфизм, мониторы (Monitors with guards), императивные конструкции (foreach, if…then…else), коллекторы списков ([…||…]) и пр.

Постановка задачи

Ознакомится с системой программирования Visual Prolog создав простейшую Пролог-программу с графическим интерфейсом.

Порядок выполнения работы

Для создания нового приложения используется эксперт приложений, который вызывается в окне Application Expert из меню Project/New Project. Выполните эту команду, в появившемся окне задайте имя проекта graf_int, установите курсор в текстовое поле ниже. Имя файла с расширением *.vpr появится автоматически.

  1. Перейдите на вкладку VPI Options, установите флажок Tree Package, нажмите кнопку Create. Появится окно нового проекта. Создадим для примера диалоговое окно «Hello, world!». Для этого создадим в меню команду, которая будет активизировать это окно.
  2. В окне проекта нажмите кнопку Menu на левой панели инструментов. Отобразится список зарегистрированных в текущем проекте меню, дважды щелкните строку Task Menu для запуска редактора меню. Щелкните строку &Edit и нажмите кнопку New. В поле Text окна Menu Item Attributes запишите &Test и нажмите кнопку ОК. Заметьте, что константу id_test для пункта меню вводить не надо – она присваивается автоматически. Символ {&} используется для определения «горячих» клавиш.
  3. После того, как создан пункт меню Test, создайте подменю Hello, world! Для этого в окне Тask Menu маркируйте строку &Test и нажмите кнопку Submenu. Аналогичным образом создайте команду подменю Hello world, для возврата нажмите кнопку Back. Добавьте самостоятельно еще одну команду подменю New string. Для того, чтобы проверить новое меню, нажмите кнопку Test. В результате меню Visual Prolog примет вид (см. рис. ниже).
  4. Воспользуемся редактором VPI для создания диалогового окна Hello, world!. Для этого нажмите кнопку Window на левой панели инструментов окна проекта. Дважды щелкните строку Task window. В окне Window Attributes нажмите кнопку Code Expert. Появится окно Dialog and Window Expert. В списке Event Type выберите строку Мenu, в списке Event or Item – строку id_Test_hello_world. Затем нажмите кнопку Add Clause. Это нужно для генерации Пролог-кода для данного события. После генерации кода кнопка изменит свой вид на Edit clause. Нажмите эту кнопку.
  5. Появится окно редактора кодов. Просмотрите только что сгенерированный код. Найдите в разделе кода, озаглавленного %BEGIN Task Window, id_Test_hello_world второй знак {!} – знак отсечения. Поставьте перед ним курсор, вызовите контекстное меню, в котором выберите команду Insert/Predicate Call/Window, Dialog or Toolbar. В появившемся окне Insert Call of … выберите позицию списка dlg_Note и ниже наберите сообщение «hello world» включая кавычки, нажмите кнопку ОК.
  6. Запустите приложение кнопкой R на панели инструментов или командой Run. Появится приложение с заголовком окна graf_int, в котором, при выборе команды меню Test/Hello world, появляется окно с надписью hello world. Закройте окно приложения.
  7. Добавим к проекту новое окно. Предположим, что новое окно My window должно иметь новый исходный код, независимый от остальной части проекта. В Visual Prolog можно обрабатывать множество окон и диалоговых окон в одном и том же исходном модуле. В нашем случае мы создадим отдельный новый модуль. Для этого нажмите кнопку Module, затем кнопку New в окне проекта. Введите имя файла нового модуля, например My window, и нажмите кнопку Открыть. В появившемся окне нажмите ОК для принятия всех настроек автоматически. Просмотрите только что сгенерированный код.
  8. Для добавления окна к проекту воспользуйтесь кнопками Window, затем New в окне проекта. Появится окно Window Attributes. Задайте имя окна My window и нажмите кнопку ОК. Появятся заготовка окна и редактор окон (после нажатия кнопки Code Expert). Появившиеся панели инструментов предназначены для создания рабочих элементов окна. В окне редактора выберите в выпадающем списке Module модуль, соответствующий имени окна, затем нажмите кнопку Default Code. Нажмите на кнопку Edit Code для изучения кода.
  9. Теперь, когда окно создано, его нужно активизировать. Добавим команду my window в меню Тest нашего проекта. Для этого нужно воспользоваться кнопкой Submenu в окне Task Menu (см. выше). Активизируйте эксперта для нового пункта меню с помощью кнопок Window (Task Window) и Code Expert. Придайте окну Dialog and Window Expert вид, показанный на рисунке. Нажмите кнопки Add Clause и затем Edit Clause.
    Появится окно редактора кодов. Просмотрите только что сгенерированный код. Найдите в тексте кода соответствующий знак {!} – знак отсечения. Поставьте перед ним курсор, вызовите контекстное меню, в котором выберите команду Insert/Predicate Call/Window, Dialog or Toolbar. В появившемся окне Insert Call of … выберите позицию списка User Defined Window (в выпадающем списке будет только одна позиция – имя нашего окна My window) нажмите кнопку ОК.
    Затем запустите приложение. Убедитесь в появлении новой команды меню, убедитесь, что новая команда работает.
  10. Добавим в новое окно какой-либо элемент графики, например, диагонали окна. Для этого предварительно нужно нажать кнопку Window и щелкнуть строку My window. Далее нужно вызвать окно редактора кода для окна my window. Воспользуемся кнопками Code Expert и Edit Code {в окне проекта}. Добавим в конец Пролог-программы следующий код:
    win_my_window_eh(_Win,e_Update(_),0):-!,
    RCT=win_GetClientRect(_Win),
    RCT=rct(_,_,R,B),
    draw_Line(_Win,pnt(0,0),pnt(R,B)),
    draw_Line(_Win,pnt(0,B),pnt(R,0)),!.

    Запустите проект, убедитесь, что окно отображается в виде, показанном на рисунке.

  11. Добавим в окно my window какой-либо управляющий элемент. Для этого выделите в кодах этого окна раздел диагоналей как комментарий – /*...,*/. Вернитесь к редактированию окна. Для установки в окно рабочих элементов воспользуйтесь панелью инструментов Controls (см.п.8).
  12. Щелкните на панели Controls кнопку PushButton, растяните рамку по размерам будущей кнопки в заготовке окна. При отпускании кнопки мыши появится окно PushButton Attirutes. Задайте значения для кнопки: в поле TextStart, в поле Constantidc_startstop.
    Аналогично установите в окне объект CheckBox, задайте имя – Show Date, константу - idc_show_date.
  13. Вызовите окно редактора кода для окна, обратите внимание на то, что Пролог автоматически добавил строки для вызова 2-х новых элементов.
  14. Добавьте код для запуска/остановки таймера:
    facts - clock
    timer(window,long TimerId)
     
    predicates
    startTimer(window)
    stopTimer(window)
     
    clauses
    startTimer(Win):-TimerId=timer_Set(Win,1000),assert(timer(Win,TimerId)).
    stopTimer(Win):-retract(timer(Win,TimerId)),!,timer_Kill(TimerId).
  15. Добавьте код обработчика событий для кнопки: (предикат win_GetText возвращает надпись на кнопке; предикат win_SetText устанавливает новый текст для кнопки).
    win_my_window_eh(_Win,e_Control(idc_startstop,_CtrlType,_CtrlWin,_CtlInfo),0):-
    	Title=win_GetText(_CtrlWin),
    	Title = "Start",
    	startTimer(_Win),
    	win_SetText(_CtrlWin,"Stop"),
    	!.
    win_my_window_eh(_Win,e_Control(idc_startstop,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
    	stopTimer(_Win),
    	win_SetText(_CtrlWin,"Start"),
    	!.
     
    win_my_window_eh(_Win,e_Update(_),0):-
    _CtrlWin =win_GetCtlHandle(_Win, idc_show_date),
    _IsChecked = win_IsChecked(_CtrlWin),
    _IsChecked = checkbox_on,
    !,
    win_Clear(_Win,color_White),
    RCT=win_GetClientRect(_Win),
    time(Hours,Minutes,Seconds,_),
    date(Year,Month,Day),
    format(Str,"%/%/% - %02:%02:%02",Year,Month,Day,Hours,Minutes,Seconds),
    draw_TextInRect(_Win, RCT, Str, -1,[dtext_center,dtext_vcenter,dtext_singleline]),
    !.
    win_my_window_eh(_Win,e_Update(_),0):-!,
    win_Clear(_Win,color_White),
    RCT=win_GetClientRect(_Win),
    time(Hours,Minutes,Seconds,_),
    format(Str,"%02:%02:%02",Hours,Minutes,Seconds),
    draw_TextInRect(_Win, RCT, Str, -1,[dtext_center,dtext_vcenter,dtext_singleline]),
    !.
     
    win_my_window_eh(_Win,e_Timer(_TimerId),0):-!,
    win_Invalidate(_Win),
    !.
    win_my_window_eh(_Win,e_Control(idc_show_date,_CtrlType,_CtrlWin,_CtlInfo),0):-!,
    win_Invalidate(_Win),
    !.
  16. Запустите проект, убедитесь в его работе.

Содержание отчёта

courses/knowledge_base_and_expert_system/lab1.1566927105.txt.gz · Last modified: 2022/12/10 09:08 (external edit)