Программа пролог руководство пользователя

ПРОЛОГ – это программа, используемая для хранения информации, полученной с приборов учета или же импортированных с накопителей АДС90 или АДС91.

Использование

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

Возможности

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

Все сохраняемые данные будут загружены в соответствующие шаблоны.

Управление выполнением программы на Прологе

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

Требования

Программа может быть установлена на любые современные версии Windows. ПО имеет ряд своих требований, без которых использовать его будет невозможно. К таким требованиям относятся: наличие СОМ-порта при непосредственном считывании информации с приборов, наличие модема при опросе посредством телефонной линии, а также подключение к сети при использовании виртуального опроса. 

Ключевые особенности

  • загрузка данных с приборов учета напрямую (COM-порта), а также с помощью модема;
  • встроенный каталог макетов отчетных форм;
  • загрузка показателей с приложения НАКОПИТЕЛЬ или АДС90/АДС91;
  • отправка данных в TXT, HTML и XLS для дальнейшей обработки в другом ПО;  
  • совместима с большинством версий Windows.

ОСП   ООП   к алгоритмизации   СУБД   Экспертные системы   ЯиМП   3GL   4GL   5GL   ТП

Логическое программирование на языке Prolog

Особенности языка Пролог

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

Ориентация Пролога – “нетрадиционные” применения вычислительной техники: понимание естественного языка, базы знаний, экспертные системы и другие задачи.

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

Программа на прологе состоит из предложений, которые могут быть фактами, правилами или вопросами.

Правила сопоставления термов в системе Пролог

Терм – элемент Пролог-программы – либо константа, либо переменная, либо структура.

Терм записывается как последовательность литер, которые делятся на 4 категории: {A..Z},{a..z}, {0..9},{+ — * / ^ < > ~ : .

? @ # $ &}.

Наиболее важная операция над термами – сопоставление. Сопоставление – процесс проверки сопоставимости термов.

Два терма сопоставимы, если:

— они идентичны,

— переменным в обоих термах можно присвоить в качестве значений объекты таким образом, что после подстановки они станут идентичными.

Например, date(Day,июнь,1999) и date(Day1,июнь,1999) сопоставимы, поскольку переменным Day и Day1 можно присвоить одинаковые значения от 1 до 31.

Общие принципы поиска ответов на вопросы системой Пролог

Вопрос в системе Пролог представляет собой последовательность 1 или нескольких целей.

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

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

Объекты данных

Объекты данных в Прологе могут быть простыми данными и структурами. Простые данные могут быть константами и переменными. Константы могут быть атомами, числами и строками.

Пролог-система распознает тип объекта по его синтаксической форме в тексте программы.

Атом – комбинация букв, цифр и знака подчеркивания, начинающаяся со строчной буквы. Примеры: a, «это_атом», «this_is_atom».

Переменная – комбинация букв, цифр и знака подчеркивания, начинающаяся с прописной буквы. Примеры: V, Это_переменная25.

Структурированные объекты

Cтруктурные объекты (или просто структуры) — это объекты, которые состоят из нескольких компонент. Эти компоненты, в свою очередь, могут быть структурами.

Основной характеристикой структуры является ее размерность (или арность) — число термов в списке.

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

Например, дату можно рассматривать как структуру, состоящую из трех компонент: день, месяц и год: дата( 1, май, 2000 ) .

Структура программы

Программа на Турбо Прологе состоит из следующих семи разделов:

  • директивы компилятора — дополнительные инструкции по обработке программы;
  • CONSTANTS — раздел описания констант;
  • DOMAINS — раздел описания доменов;
  • DATABASE — раздел описания предикатов внутренней базы данных;
  • PREDICATES — раздел описания предикатов;
  • CLAUSES — раздел описания предложений;
  • GOAL — раздел описания внутренней цели.

Директива trace применяется при отладке программы для трассировки.

В программе не обязательно должны быть все эти разделы. Так, например, она может состоять из одного описания цели:

X= [1, 2, 3, 4, 5]

  • для того, чтобы проверить, получится ли при объединении двух списков третий:
  • ?-conc([1, 2, 3], [4, 5], [1, 2, 5]) No
  • для разбиения списка на подсписки:
  • Или задать его непосредственно:
  • last2([X],X). /* последний элемент одноэлементного списка — этот элемент */ last2([_|L],X):– last2(L,X). /* последний элемент списка совпадает с последним элементом хвоста */

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

    reverse([ ],[ ]). /* обращение пустого списка дает пустой список*/ reverse([X|T],Z):– reverse(T,S), conc(S,[X],Z). /* обращаем хвост и приписываем к нему справа первый элемент исходного списка*/

    Другой способ реверса:

    rev([H|T],L1,L2):– rev(T,[H|L1],L2). /* голову первого аргумента дописываем ко второму аргументу*/ rev([ ],L,L). /* если исходный список закончился, то второй аргумент — передаем в третий аргумент в качестве результата*/

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

    n_element([X|_],1,X). n_element([_|L],N,Y):– N1=N–1, n_element(L,N1,Y).

    Предикат, проверяющий является ли элемент списком.

    is_list([_|_]).

    Предикат, преобразующий список в одноуровневый(первый аргумент — исходный список, второй — результат).

    simple_list([],[]). simple_list([H|List],List1):- is_list(H), /*если голова списка – список,*/ simple_list(H,List1). /*то рекурсивно вызываем предикат simple_list и передаем ему ее в качестве входного параметра*/ simple_list([H|List],[H|List1]):- not is_list(H), /*если голова списка – простой элемент,*/ simple_list(List,List1). /*то рекурсивно вызываем предикат simple_list и записываем ее в список — результат*/

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

    delete_all(_,[],[]). delete_all(X,[X|L],L1):– delete_all (X,L,L1). delete_all (X,[Y|L],[Y|L1]):– X<>Y, delete_all (X,L,L1).

    Тепловычислитель СПТ 943

    Если нужно удалить не все вхождения определенного значения в список, а только первое, то :

    delete_one(_,[],[]). delete_one(X,[X|L],L):–!. delete_one(X,[Y|L],[Y|L1]):– delete_one(X,L,L1).

    Предикат, добавляющий элемент в список (первый параметр – вставляемый элемент, второй — исходный список, а третий — результат).

    add(X, L, [X|L]).

    Но если возникает необходимость добавлять только, если элемент отсутствует, то можно использовать правило:

    add(X, L, L):-member(X, L), !. add(X, L, [X|L]).

    Проверка типов термов

    Встроенные предикаты для проверки типов термов:

    atom(X) -истина, если X-атом.

    integer(X) — истина, X-целое.

    float(X) – истина, если Х – действительное число.

    compound(X) – истина, если Х – составной терм.

    atomic(X) — истина, если X-целое или атом.

    var(X) — истина, если X-не конкретизированная переменная.

    nonvar(X) — истина, если X- терм, отличный от переменной, или уже конкретизированная
    переменная.

    ground(Х)-

    истина, если Х не содержит свободных переменных.

    number(Х)

    — истина, если Х – число.

    string(Х)

    – истина, если Х – строка.

    Операции с базами данных

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

    Описание отношений присутствует либо в явном виде (факты), либо в неявном виде (правила).

    Встроенные предикаты :

    assert(d) всегда успешен и добавляет факт d к базе данных;

    retract(d) удаляет факт, сопоставимый с d;

    asserta(d) — обеспечивает запись в начало базы данных нового факта для заданного отношения;

    assertz(d) — обеспечивает запись в конец базы данных нового факта для заданного отношения.

    Объявление динамической базы данных осуществляется с помощью ключевого слова database.

    ОСП   ООП   к алгоритмизации   СУБД   Экспертные системы   ЯиМП   3GL   4GL   5GL   ТП

    Знаете ли Вы, что диаграмма классов, Class diagram — это методология объектно-ориентированного проектирования, предназначенная для представления статической структуры модели системы в терминологии классов объектно-ориентированного программирования.
    НОВОСТИ ФОРУМА
    Рыцари теории эфира
     

    Цель работы: ознакомление с основами среды логического программирования Visual Prolog.

    Установка Visual Prolog

    Скачать Visual Prolog 5.2.
    32-х разрядная версия Visual Prolog 5.2 для Windows была установлена на 64х разрядный компьютер с операционной системой OpenSUSE 42.1, при этом использовался Wine 1.8.4. Процесс установки ничем не отличается от установки под Windows, при клике по установщику автоматически запускается Wine и процесс установки продолжается в обычном режиме.

    Создание проекта в Visual Prolog

    После установки системы, запускаем Visual Prolog и создаем проект. В появившемся окне вводим имя проекта и путь к нему.

    Затем нужно перейти во вкладку Target и выбрать консольный режим (Textmode), т. к. наше приложение будет консольным:

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

    Разработка программы в Visual Prolog

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

    Открываем файл parents.pro, приступаем к написанию исходного кода. Нам требуется создать базу родственных отношений между именами. Опишем тип имени в секции domains:

    domains name = symbol

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

    Опишем отношение базы данных, задающее родство двух имен:

    database parent(name, name)

    Теперь можно добавлять элементы во внутреннюю базу данных. Сделать это можно в секции clauses:

    clauses parent(ilia, marina). parent(marina, ira). parent(elena, ivan). parent(nikolay, ira). parent(olga, aleksei). parent(marina, sasha). parent(sergei, ivan).

    Первый запрос, который мы реализуем, должен проверять, что «Марина является родителем Саши».

    Запросы описываются в секции goal:

    Для запуска цели нажимает комбинацию Ctrl+g, программа запускается и начинает свое выполнение с секции goal. В появившемся окне можем наблюдать результат работы программы.

    Товар не найден!

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

    Следующее утверждение, которое проверим «Алексей является родителем Ольги» — ложно, т. к. в базе нет факта . Запишем этот запрос в секции goal и убедимся, что результат — no:


    В запросе «Кто является ребенком Николая» нужно использовать анонимную переменную (ее имя начинается с большой буквы), т. к. имя ребенка неизвестно. Интерпретатор попробует подобрать все возможные решения, сопоставив эту переменную с каждым значением базы данных. В результате он сообщит нам, что ребенок Николая — Ира:

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

    При определении всех родителей и их детей мы используем две анонимных переменных в запросе (т. к. ни конкретные родители, ни дети нам заранее не известны). В результате будет выведено все содержимое нашей базы данных:

    Более подробно про работу с базами данных в Prolog.

    Выводы по работе в Visual Prolog:

    1.

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

    Примеры:

    Hello, World!:

    Пример для версий B-Prolog 7.4-3, ECLiPSe CLP 6.0 #188, Poplog 15.5 (Prolog), gprolog 1.3.0, swipl 5.6.x

    Этот пример не требует загрузки фактов или правил. Запрос выполняется в интерактивном режиме, и его результат выглядит следующим образом:

    Первая строка является собственно выводом предиката , вторая — результат оценивания запроса.

    Следует отметить, что замена одинарных кавычек на двойные выводит строку как массив ASCII-кодов отдельных символов:

    Квадратное уравнение:

    Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.x

    Этот пример соответствует стандарту ISO Prolog и использует встроенный предикат . Следует отметить, что при вводе термов этим способом после каждого терма следует ставить точку.

    Факториал:

    Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.x

    Как в GNU Prolog, так и в B-Prolog 12! не помещается в целочисленный тип данных, поэтому все значения после 11! неправильны. В SWI-Prolog переполнения не возникает.

    Результат для GNU Prolog:

    Результат для B-Prolog:

    `| ?- fact(16,X).

    0! = 1
    1! = 1
    2!

    Скачать ПРОЛОГ

    = 2
    3! = 6
    4! = 24
    5! = 120
    6! = 720
    7! = 5040
    8! = 40320
    9! = 362880
    10! = 3628800
    11! = 39916800
    12! = -57869312
    13! = -215430144
    14! = 205203456
    15! = -143173632
    16! = -143294464

    X = -143294464 ?`

    Числа Фибоначчи:

    Пример для версий B-Prolog 7.4-3, gprolog 1.3.0, swipl 5.6.x

    Пример почти идентичен примеру для Poplog Prolog, за исключением синтаксиса подключения файла.

    SWI-Prolog — это мощная среда разработки с набором графических инструментов ХРСЕ. Ядро системы лицензировано под GNU LGPL, библиотеки — под GNU GPL с дополнительным условием, позволяющим использование в проприетарных приложениях. Развитие SWI-Prolog началось в 1987 г., и сегодня он широко используется в исследовательских и образовательных целях, а также в коммерческих приложениях.

    SWI Prolog — довольно популярная система, в основном благодаря удобной среде и переносимой библиотеке для создания графического интерфейса. SWI-Prolog, как почти все реализации языка, по большей части реализует Edinburgh Prolog, но также содержит отдельные элементы ISO Prolog.

    SWI-Prolog включает в себя быстрый компилятор, профилировщик, набор библиотек и удобный интерфейс для подключения C-модулей. Он реализован для ряда UNIX-платформ, таких, как HP, IBM Linux, для NeXT, OS/2, Sun и Sparc.

    4.25Operators

    Operators are defined to improve the readability of source code. For example, without operators, to write one would have to write . In Prolog, a number of operators have been predefined. All operators, except for the comma (,) can be redefined by the user.

    Some care has to be taken before defining new operators. Defining too many operators might make your source `natural’ looking, but at the same time make it hard to understand the limits of your syntax. To ease the pain, as of SWI-Prolog 3.3.0, operators are local to the module in which they are defined. Operators can be exported from modules using a term in the export list as specified by module/2. Many modern Prolog systems have module specific operators. Unfortunately, there is no established interface for exporting and importing operators. SWI-Prolog’s convention has been addopted by YAP.

    The module table of the module acts as default table for all modules and can be modified explicitly from inside a module to achieve compatibility with other Prolog that do not have module-local operators:

    :- module(prove, [ prove/1 ]). :- op(900, xfx, user:(=>)).

    In SWI-Prolog, a quoted atom never acts as an operator. Note that the portable way to stop an atom acting as an operator is to enclose it in parentheses like this: (myop). See also section 5.3.1.

    [ISO]op()
    Declare to be an operator of type with precedence . can also be a list of names, in which case all elements of the list are declared to be identical operators. is an integer between 0 and 1200. Precedence 0 removes the declaration. is one of: , , , , , or . The `’ indicates the position of the functor, while and indicate the position of the arguments. `’ should be interpreted as «on this position a term with precedence lower or equal to the precedence of the functor should occur». For `’ the precedence of the argument must be strictly lower. The precedence of a term is 0, unless its principal functor is an operator, in which case the precedence is the precedence of this operator. A term enclosed in parentheses has precedence 0.

    The predefined operators are shown in table 5. Operators can be redefined, unless prohibited by one of the limitations below. Applications must be careful with (re-)defining operators because changing operators may cause (other) files to be interpreted differently.

    Руководство пользователя турбо пролог 2.0.

    Often this will lead to a syntax error. In other cases, text is read silently into a different term which may lead to subtle and difficult to track errors.

    • It is not allowed to redefine the comma ().
    • The bar () can only be (re-)defined as infix operator with priority not less than 1001.
    • It is not allowed to define the empty list () or the curly-bracket pair () as operators.

    In SWI-Prolog, operators are local to a module (see also section 6.8).

    Keeping operators in modules and using controlled import/export of operators as described with the module/2 directive keep the issues manageable. The module provides the operators from table 5 and these operators cannot be modified. Files that are loaded from the SWI-Prolog directories resolve operators and predicates from this module rather than , which makes the semantics of the library and development system modules independent of operator changes to the module.

    1200 xfx ,
    1200 fx ,
    1150 fx dynamic, discontiguous, initialization, meta_predicate, module_transparent, multifile, public, thread_local, thread_initialization, volatile
    1100 xfy ,
    1050 xfy ,
    1000 xfy
    990 xfx :=
    900 fy
    700 xfx , , , , , , , , , , , , , , , , , as, is, ,
    600 xfy
    500 yfx , , , , xor
    500 fx
    400 yfx , , , div, rdiv, , , mod, rem
    200 xfx
    200 xfy
    200 fy , ,
    100 yfx
    1 fx

    Table 5 : System operators

    [ISO]current_op()
    True if is currently defined as an operator of type with precedence . See also op/3.

    Добавить комментарий

    Закрыть меню