Визуальный пролог — visual prolog

Факты и правила

Часто программу, написанную на Прологе, называют базой знаний.

База знаний на Прологе состоит из предложений, т.е. утверждений, каждое из которых завершается точкой.
Существует два вида предложений: факты и правила.

Предложения-правила имеют вид:

B1,… , Bn.

Где  — это заголовок или голова предложения, а  – это тело.

Пример факта:

likes  (bill, dogs).

где — факт, — аргументы факта, между которыми выполнено отношение ()

Т.к. отношение в математической логике принято называть предикатами, то и мы иногда будем использовать понятие «предикат» вместо «факта» или «правила».

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

Если факт состоит только из заголовка, то можно сказать, что факт – это предложение, у которого тело пустое.

Аргументом факта или предиката может быть константа, переменная или составной объект; от их числа зависит так называемая местность (n-местность) факта.

Отличие константы от переменной: константа получает свое значение в разделе описания констант, тогда как переменная инициализируется в процессе работы программы.

В TProlog имя предиката или факта может содержать:  латинские буквы, цифры, знаки подчеркивания и начинаться с буквы или знака подчеркивания.

В следующем примере наводите курсор на части конструкций, и появится подсказка:

Таким образом, в примере — это имя двухаргументного предиката (факта), у которого строковая константа «» является первым аргументом, а «» — вторым аргументом.

Аргументы с известными или постоянными значениями должны начинаться со строчных букв

Задание prolog 2_2: Дано начало программы (раздел и ) для базы данных «Возраст ребенка». Составить факты для программы, основываясь на данных указанных разделов и следующих сведений: Ивану 2 года, Алексу 3 года, Марии — 5 лет.

domains 
  a=symbol
  b=integer
predicates
  age(a,b)
clauses
 age(...,...).
 ...(...,...).
 ...(...,...).

Наберите код программы в компиляторе.

LIMITED WARRANTIES AND LIMITATION OF LIABILITY

PDC MAKES NO WARRANTIES OR REPRESENTATIONS, EXPRESS OR IMPLIED,
REGARDING THE SOFTWARE, MEDIA OR DOCUMENTATION AND HEREBY EXPRESSLY
DISCLAIMS THE WARRANTIES OF MERCHANT ABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.

PDC does not warrant the Software will meet your requirements
or that its operation will be uninterrupted or error free.

PDC or anyone involved in the creation or delivery of the Software
or Documentation to you shall have no liability to you or any third
party for special, incidental, or consequential damages arising
from claims based in warranty, contract, tort (including negligence),
strict tort, or otherwise even if PDC has been advised of the possibility
of such claim of damage. PDC’s liability for direct damages
shall not exceed the actual amount paid for the product.

Прием

Брюс Ф. Вебстер из BYTE похвалил Turbo Prolog в сентябре 1986 года, заявив, что это был первый продукт Borland, который взволновал его так же сильно, как Turbo Pascal. Ему понравился пользовательский интерфейс и низкая цена, и он сообщил, что два профессора BYU заявили, что он превосходит Prolog, который они использовали в университете. Ставя под сомнение рыночный спрос на язык, Вебстер пришел к выводу, что «Turbo Prolog может стать таким же значительным скачком в разработке программного обеспечения, каким был Turbo Pascal три года назад», и рекомендовал его тем, «кто вообще интересуется искусственным интеллектом, базами данных, экспертными системами. , или новые способы мышления о программировании «. Другой автор в журнале в том же месяце написал, что нестандартный, более структурированный синтаксис языка делает «списки источников более читабельными, чем стандартные прологи». Заявив, что у него «много хороших функций», он заявил, что «вкус Turbo Pascal в его компиляторе и строгая типизация данных … создают проблему идентификации для языка». Описав его как «Turbo Paslog», автор пришел к выводу, что он «не рекомендует его, если вы серьезно подумываете о том, чтобы стать программистом на Prolog». Журнал в 1989 году включил Turbo Prolog 2.0 в число победителей премии BYTE Awards «Отличие», одобрив то, как Borland «разработала систему для программирования реальных приложений».

Все Решения Сразу

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

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

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

  • Первый аргумент, VarName, определяет аргумент в вызываемом целевом предикате, значения которого будут собираться в список.
  • Второй — mypredicate — определяет предикат, который будет получать значения.
  • Выходной параметр ListParam, является переменной, которая содержит список значений, полученных в ходе отката.

Программа e02.pro использует обработку списка для вывода среднего возраста группы людей.

        /* Программа e02.pro */
class my
domains
  name = string.
  address = string.
  age = integer.
 
predicates
  person  (name, address, age) nondeterm anyflow.
  sumlist  (age*, age, integer)procedure(i,o,o).
end class my
 
implement my
clauses
  sumlist(,,).
  sumlist(H|T, Sum, N):-
    sumlist(T, S1, N1),
    Sum=H+S1, N=1+N1.
 
  person("Sherlock Holmes","22B Baker Street", 42).
  person("Pete Spiers","Apt. 22, 21st Street", 36).
  person("Mary Darrow","Suite 2, Omega Home", 51).
end implement my
 
goal
  console::init(),
  L =  Age || my::person(_, _, Age),
  my::sumlist(L, Sum, N),
  Ave = SumN,
  stdio::write("Average=", Ave, ". ").

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

List =  Who || my::person(Who, _, 42) 

Следующий код порождает список всех положительных чисел исходного списка:

List =  X || X = list::getMember_nd(2,-8,-3,6), X > 

Getting the Main Code into the Program

We have finished all the work for all the GUI functionality that we need from the program. Now we shall start inserting the logic of the code. Before we do that, let us understand some important differences between the way programming used to be done and how it would now be done for a GUI program.

When a user uses a GUI program, it is like the user is using a room. The user comes into the room through the main door all right but once inside the room; the user is free to decide which part of the room would be put to use. Undoubtedly, the programmer has the last say on how each of those parts would actually work. But by and large the user is free to decide which part of the program to activate. The Goal procedure is still present in a GUI program but here all it does is to just set up the stage for the user to work on. It is like the main door to the room in our analogy.

What does this imply for the programmer? The logic of the code earlier was contained inside one module. Now it will be spread over several modules, depending on the logic which is controlled by corresponding GUI components.

Let us add some basic logical code that is needed by the program. Open TaskWindow.pro and insert the following code:

domains
    gender = female(); male().
 
class facts - familyDB
    person  (string Name, gender Gender).
    parent  (string Person, string Parent).
 
class predicates
    father  (string Person, string Father) nondeterm anyflow.
clauses
    father(Person, Father) :-
        parent(Person, Father),
        person(Father, male()).
 
class predicates
    grandFather  (string Person, string Grandfather) nondeterm anyflow.
clauses
    grandfather(Person, Grandfather) :-
        parent(Person, Parent),
        father(Parent, Grandfather).
 
class predicates
    ancestor  (string Person, string Ancestor) nondeterm anyflow.
clauses
    ancestor(Person, Ancestor) :-
        parent(Person, Ancestor).
    ancestor(Person, Ancestor) :-
        parent(Person, P1),
        ancestor(P1, Ancestor).
 
class predicates
    reconsult  (string FileName).
clauses
    reconsult(Filename) :-
        retractFactDB(familyDB),
        file::consult(Filename, familyDB).

The above code is the logical core of the program. In this tutorial, we would directly be inserting it into the module TaskWindow.pro because we want you to see how the GUI components reach into the logical core to perform various actions. In more complex examples; the logical core would be residing separately, sometimes spread over several modules. The GUI modules (such as TaskWindow, etc.) would then be referring it to those modules separately by increasing the scope of the module (discussed in an earlier tutorial).

Actually, it would be good practice to keep the logical core of the program separate from all GUI related modules as far as possible, but in this tutorial we shall knowingly ignore this sound advice.

Running the Program

Once you start the program, you would notice that no activity gets performed immediately, the way it was done in the console program which we had written earlier. As explained somewhere before, starting up a GUI program is like entering a room where the user is free to do things in whichever order he/she chooses. The room simply waits for inputs from the user in whichever order the user decides to give.

Analogously, in our little program, we can invoke the Query|Query Father menu without loading any data. It would not yield any results or any error either because our main logic also takes care of the situation where the data is absent. We can invoke the File|Open… menu item at our choice, and load the family database (the same one which was used in the earlier tutorial).

After that, we can test the Query|Query Father, Query|Query Ancestor and Query|Ancestor of… to see the same results that were obtained in the console program. The results would be displayed in the Messages. (Be careful not to close the Messages window, else the results would not get displayed). The advantage of a GUI program would be recognized when we find that we can run our queries any number of times. Also, we are free to load different data at any point in time.

Создание нового исходного модуля

   
Нам нужно будет добавить исходный код Пролога для окна Cross, и, т. к. окно Cross будет иметь код, независимый от
остальной части кода в проекте, мы поместим этот код в отдельный (новый) модуль. В Visual Prolog возможно
обрабатывать множество окон и диалоговых окон в одном и том же исходном модуле. Как организовать проект — это
решение программиста. В данном случае, повторим, мы создадим новый модуль. В окне проекта сначала нажмите
кнопку Module (на левой стороне), а затем кнопку New, в результате чего появится окно, изображенное на рис. 1.

Рис.1. Добавление нового исходного модуля

   
Когда вы наберете имя нового модуля, нажмите кнопку Открыть (Open), появится диалоговое окно, в котором можно определить,
генерировать ли файлы DOM и PRE для модуля (рис. 2). Хорошая идея — поместить любые экспортируемые из
модуля объявления глобальных доменов в файл Cross.dom, а любые экспортируемые глобальные предикаты в файл
Cross.pre.

Рис.2. Диалоговое окно атрибутов для модуля

   
В нашем проекте используются только значения по умолчанию (см. рис. 2), но для реальных (больших) проектов вы
должны иметь в виду следующее.

  • Не включайте никакие файлы вида <ModuleName>.PRE
    в файл Myproj.inc. Однако включите файлы вида
    <ModuleName>.PRE в каждый модуль, который использует глобальные предикаты, экспортируемые в файл
    <ModuleName>.PRE. Это уменьшит количество файлов для просмотра и число предикатов, используемых в каждом
    модуле (компилятор имеет ограничение на число предикатов, используемых в модуле).
  • Файл, содержащий символьные константы, которые определяют идентификаторы ресурсов (Myproj.con), следует
    включать в модуль, только если на него есть ссылка из модуля (модуль использует идентификаторы ресурсов).
  • Файл, содержащий символьные константы для контекстных номеров страниц справки (Hlptopic.con), следует
    включать в модуль, только если на него есть ссылка в этом модуле.

   
Если вы новичок в программировании на Visual Prolog, то вы можете не знать, что файлы с расширением рrе содержат
определения предикатов и функций Пролога (подобно файлам с расширением Н в языке С), или что файлы с
расширением dom содержат информацию относительно определенных пользователем доменов. Впрочем, эти примеры
не требуют глубокого знания языка Visual Prolog.

   
Нажмите кнопку ОК, чтобы принять установки по умолчанию. Если вы рассмотрите новый сгенерированный исходный
модуль, то увидите, что создан заголовок, основанный на параметрах, заданных в эксперте приложений. Кроме того,
включен глобальный файл для проекта (include «myproj.inc»).

/****************************************
   Copyright (с) Prolog Development Center
   Project MYPROJ
   FileName CROSS PRO
   Purpose No description
   Written by Visual Prolog
   Comments
*****************************************/
   include "myproj.inc"
   include "myproj.con"
   include "hlptopic.con"

   
Новый файл Cross.pre также был сгенерирован и помещен в каталог проекта. Если вы посмотрите на глобальный
включаемый файл, вы увидите, что Cross.pre включен в нижней части файла Myproj.inc:

   include "cross.pre".

   
Эксперты окон и диалоговых окон размещают объявления глобальных предикатов в файле <ModuleName>.PRE.

GUI: Responding to Events

In a GUI program, all the GUI components wait for inputs from the keyboard and/or mouse (and/or other pointing devices such as digitizer puck, etc.).

The information from such input devices (click of a mouse and other such GUI activity) is known as an event. There are other events to which a GUI responds — some of them are internally generated by the operating system such as ticking of the internal clock, interaction with other programs running concurrently, ActiveX events, etc. Depending on what the program is expected to do, the programmer earmarks appropriate portions of code to respond to relevant events. PFC GUI package provides the set of listeners and responders to handle GUI events.

When the program responds to an event, the program can either listen the event or handle the event. If an event is listened, then it means the program can just do something. For example the show event comes, when a window is shown, hence program can make some initialization here. If an event is responded, then it means the program can change the behaviour of the system. For example, on the close event the program can respond either to close window or to keep it open.

Please notice also that the GUI program actually does nothing but waits till a GUI event is invoked.

One important feature of event handling must be understood here:

Because the code of a listener and a responder wait till an event has happened; it may seem as if there is no obvious logic to it. Other modules need not even know what is happening privately within the class which was actually handling a GUI event. In our earlier tutorial, we noticed that all the logic was well contained and logically connected to one another. But in case of GUI programs, parts of the code (the one that handles GUI events) would be fragmented and placed under different listeners and responders.

In this tutorial, we shall go about taking the same logic of the family example which was dealt in an earlier tutorial, and then use that logic via a GUI interface.

Главная

Turbo Prolog (Турбо-Пролог) является самым замечательным языком искусственного интеллекта (ИИ). Turbo Prolog (Турбо-Пролог) является компиляторно-ориентированным языком программирования высокого уровня. Turbo Prolog (Турбо-Пролог) разработан фирмой Borland International и предназначен для программирования задач из области искусственного интеллекта.

Как язык программирования искусственного интеллекта Turbo Prolog (Турбо-Пролог) особенно хорош для создания экспертных систем, динамических баз данных, программ с применением естественноязыковых конструкций. Turbo Prolog (Турбо-Пролог) также может быть использован и для других задач общего характера.

Turbo Prolog (Турбо-Пролог) имеет окна, цветную графику и интерактивные средства ввода-вывода, что свидетельствует о его максимальном удобстве для пользователя прикладных программ.

Встроенные предикаты Turbo Prolog (Турбо-Пролог) и другие дополнительные возможности делают его пригодным для решения многих стандартных задач из сферы бизнеса, включая бухгалтерский учет, расчет зарплаты и представление графиков.

Наряду с Turbo Prolog (Турбо-Пролог) в США созданы еще несколько реализаций Пролога: Arity Prolog, Prolog II, Wisdom Prolog и Micro Prolog. В отличие от них Turbo Prolog (Турбо-Пролог) имеет великолепный полноэкранный редактор, множество рабочих окон и интерактивный диалоговый отладчик. Turbo Prolog (Турбо-Пролог) поддерживает цветную графику IBM PC, снабженного цветным графическим адаптером (CGA) и расширенным графическим адаптером (EGA). Предикаты графики и система с графическим экранным пером являются составной частью Turbo Prolog (Турбо-Пролог). Turbo Prolog (Турбо-Пролог) также снабжен средствами работы с последовательными файлами, файлами прямого доступа и двоичными файлами.

Написанные на Turbo Prolog (Турбо-Пролог) программы компилируются, в отличие от других версий Пролога, где программа интерпретируется.

Интерпретатор выбирает предложения программы одно за другим и последовательно исполняет их.

Компилятор транслирует в машинные коды сразу весь текст программы.

Turbo Prolog (Турбо-Пролог) транслирует исходный текст программы особенно быстро (быстрее всех других версий Пролога для компьютеров IBM PC). Также Turbo Prolog (Турбо-Пролог) позволяет легко создавать отдельные выполнимые файлы.

Turbo Prolog (Турбо-Пролог) имеет прекрасный пользовательский интерфейс для отладки программ.

Возможности

ПРОЛОГ совместим со многими, если не со всеми, тепловычислителями и корректорами расхода газа от фирмы ЛОГИКА. Считывание данных с вышеперечисленных устройств осуществляется несколькими способами: прямое подключение, доступ через интернет, модемное подключение, а также загрузка информации из мобильного приложения НАКОПИТЕЛЬ или же с накопителей АДС90/АДС91.

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

Исключения и обработка ошибок

  • Когда происходит ошибка или исключительная ситуация, возбудите исключительную ситуацию с помощью exception::raise.
  • Блокируйте (trap) исключения если Вы хотите их обрабатывать.
  • Используйте finally если необходимо выполнить некоторый код даже при возникновении исключения, и уже затем продолжите исключение.
  • Ознакомьтес с руководством по обработке исключений.

Внутренние и прочие ошибки

Следует различать внутренние ошибки и ошибки, связанные с использованием пакета, модуля, класса, компоненты. Если нарушается внутренняя инвариантность, то это внутренняя ошибка. Типичными примерами внутренних ошибок являются:

  • Факт базы данных, который должен быть определён, не определён на самом деле.
  • Предикат, который должен бы быть процедурой, но компилятор не способен это распознать, преобразован в процедуру путём добавления «холостого» клауза. Если такой кляуз достигается, то это происходит от того, что предположение о том, что предыдущий клауз не может завершиться не успешно, было неверным.

Внутренние ошибки должны генерировать по одному исключению на каждую. Использование исключений следует по принципу: по одному на каждую ошибку пользователя и по одному на каждую внутреннюю ошибку.

Типичные пользовательские ошибки:

  • Выход индекса за допустимый диапазон
  • «неправильный» указатель на окно
  • нарушение порядка следования предикатов

Блокировка (try/catch) завершения программы может быть предусмотрена по двум причинам:

  • Есть желание обработать исключение. Скажем, при открытии файла возникает прерывание, сообщающее, что файл не существует. В этом случает возникает желание блокировать завершение программы и показать некоторое сообщение об ошибке, говорящее о том, что файл не существует. Естественно, если такое исключение не является единственно возможным, то следует продолжить исключение.
  • Есть желание что-то сделать независимо от того, прерывается ли выполнение предиката. Типичный пример — Вы что-блокируете (захватываете ресурс), затем что-то делаете и, наконец, сбрасываете блокировку (освобождаете ресурс). Здесь Вам надо быть уверенным, что блокировка сброшена (ресурс освобождён), даже если выполнение прерывается. С этой целью используется try/finally.

Списки в Prolog

Списки — важная структура в Прологе. Списки позволяют хранить произвольное количество данных. Связный список — структура данных, состоящая из узлов. Узел содержит данные и ссылку (указатель, связку) на один или два соседних узла. Списки языка Prolog являются односвязными, т.е. каждый узел содержит лишь одну ссылку. Приложу наглядную картинку.

Кстати, ещё одна хорошая статья про списки в Прологе.

Списки в Прологе отличаются от списков в C/C++, Python и других процедурных языков. Здесь список — это либо пустой элемент; либо один элемент, называемый головой, и присоединенный список — хвост. Список — это рекурсивная структура данных с последовательным доступом.

Списки выглядят так: [],, , , , .Рассмотрим . Это всё список, в котором мы выделяем первый элемент, голову списка, и остальную часть, хвост списка. Чтобы отделить первые элементы от остальной части списка, используется прямая черта «|». Можно было написать такой список . Тогда мы выделим первые три элемента списка и положим их в X1, X2, X3, а остальная часть списка будет в Tail.

В списках хранятся данные, и нам нужно с ними работать. Например, находить минимум, максимум, медиану, среднее, дисперсию. Может нужно найти длину списка, длину самого длинного атома, получить средний балл по N предмету среди студентов группы G. Может нужно проверить, есть ли элемент Elem в списке List. И так далее. Короче, нужно как-то работать со списками. Только предикаты могут обрабатывать списки (да и в целом в Прологе все обрабатывается предикатами).

Напишем предикат для перебора элементов списка, чтобы понять принцип работы списка.

element(,Element) будет истинным, если Element равен Head (первому элементу списка) ИЛИ если предикат element(Tail, Element) истинный. В какой-то момент эта рекурсия окончится. (Вопрос читателю: когда кончится рекурсия? Какое условие будет терминирующим?) Таким образом, предикат будет истинным, если Element будет равен каждому элементу списка . Пролог найдет все решения, и мы переберем все элементы списка.

Часто бывает нужным знать длину списка. Напишем предикат для нахождения длины списка. Протестим.

Мой Пролог предупреждает, что была не использована переменная H. Код будет работать, но лучше использовать анонимную переменную _, вместо singleton переменной.

В SWI Prolog имеется встроенный предикат length. Я реализовал аналогичный предикат list_length. Если встречается пустой список, то его длина равна нулю. Иначе отсекается голова списка, рекурсивно определяется длина нового получившегося списка и к результату прибавляется единица.

Чтобы лучше понять алгоритм, пропишите его на бумаге. Последовательно, так, как делает Пролог.

Последняя задача про списки в этой статье, это определить, принадлежит ли элемент списку. Например, 1, 2, 3 и 4 являются элементами списка . Этот предикат мы назовем list_member.

Очевидно, что если список начинается с искомого элемента, то элемент принадлежит списку. В противном случае необходимо отсечь голову списка и рекурсивно проверить наличие элемента в новом получившемся списке.

Visual-среда разработки [ править | править код ]

Среда разработки приложений системы Visual Prolog включает текстовый редактор, различные редакторы ресурсов, средства разработки справочных систем в гипертекстовом представлении, систему отслеживания изменений, которая обеспечивает перекомпиляцию и перегенерацию только измененных ресурсов и модулей, ряд экспертов Кода, оптимизирующий компилятор, набор средств просмотра различных типов информации о проекте и отладчик. Полная интеграция всех средств обеспечивает повышение скорости разработки приложений. Полученные приложения являются исполняемыми .EXE программами. В коммерческой версии Visual Prolog 7.x возможно создание .DLL-файлов, в персональной версии такая возможность существовала вплоть до версии 5.x. Первая из возможностей, которые предоставляет IDE, заключается в управлении проектами. Поскольку среда рассчитана на создание достаточно масштабных приложений, то и средства управления файлами в рамках проекта приложения в ней представлены в достаточном для этого объёме. В среде есть встроенный редактор диалогов, который позволит организовать взаимодействие пользователя с программой при помощи графического интерфейса.

Подготовка отчетов

Одна из основных задач программы – облегчение и ускорение работы при подготовке отчетов об энергопотреблении. Для этого пользователю предоставлен механизм вывода данных по шаблонам. Всю работу по подготовке отчета можно разделить на три основных этапа: редактирование (создание) шаблона, назначение шаблона узлу и вывод отчета на печать.

Как отредактировать шаблона отчета Пролог?

Все операции по редактированию (созданию) шаблона выполняются в окне «ПРОЛОГ дизайнер». В этом окне предоставлен широкий набор инструментов, важнейшими из которых являются вставка данных из таблиц узла учета, вставка текста и вставка математических функций.


Редактор шаблонов отчетов в программе ПРОЛОГ ЛОГИКА

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

  • Назначение шаблонов
  • Вывод на печать, предварительный просмотр
  • Просмотр данных в графическом виде
  • Экспорт данных из программы Пролог

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

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

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

Совместимые библиотеки [ править | править код ]

Система программирования пользовательских интерфейсов (GUI — Graphic User Interface) системы Visual Prolog является высокоуровневой абстракцией к функциям операционной системы.

В систему включен также интерфейс с базами данных типа SQL. Почти все типы баз данных доступны с использованием Windows ODBC интерфейса. Поддерживаются также обращения к базам данных Oracle.

В инсталляционный пакет входит 50 классов (Prolog Foundation Classes). Среди них есть GDI+, криптографический, компрессия данных, COM, интерпретатор Классического Пролога PIE (Prolog Inference Engine) и пр.

Стандартные отчеты ПРОЛОГ

Руководство тепловычислителей СПТ и газовых корректоров СПГ сообщает, что в программе пролог имеются типовые отчетные формы, готовые к распечатке.

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


Пример суточного отчета о работе системы теплоснабжения

Все общие шаблоны отчетов хранятся в C:\Program Files (x86)\Prolog\Template, директории, куда была установлена программа. Шаблоны отчетов хранятся с расширением .ref

Стандартные отчеты для СПТ 940

  • СПТ 940 БД прибора
  • СПТ 940 Ведомость v.QR
  • СПТ 940 Ведомость учета отпуска
  • СПТ 940 Изменения БД
  • СПТ 940 месячный отчет KRR
  • СПТ 940 месячный отчет о работе системы теплоснабжения
  • СПТ 940 месячный отчет о работе системы ХВС
  • СПТ 940 отчет по НС
  • СПТ 940 суточный отчет о работе системы теплоснабжения
  • СПТ 940 суточный отчет о работе системы ХВС
  • СПТ 940_tect
  • СПТ 941.10(11) БД прибора
  • СПТ 941.10(11) Изменения БД v2
  • СПТ 941.10(11) Изменения БД
  • СПТ 941.10(11) месячный СП=9
  • СПТ 941.10(11) Отчет по НС
  • СПТ 941.10(11) суточный СП=9
  • СПТ 941.10(11) суточный
  • СПТ 941.20 БД прибора
  • СПТ 941.20 Ведомость v.QR
  • СПТ 941.20 ведомость учета отпуска
  • СПТ 941.20 Изменения БД
  • СПТ 941.20 месячный отчет о работе системы теплоснабжения
  • СПТ 941.20 месячный отчет о работе системы ХВС
  • СПТ 941.20 месячный отчет_KRR
  • СПТ 941.20 отчет по НС
  • СПТ 941.20 суточный отчет о работе системы теплоснабжения
  • СПТ 941.20 суточный отчет о работе системы ХВС
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector