Пролог логическое программирование. Как настроить корректор СПГ761 для возможности получения параметров теплоснабжения и архивных данных на ПК через адаптер АПС79


1. Коммерческий или технологический учет.

2. ТУ на проектирование УУТЭ (если имеется).

3. Тип системы теплоснабжения.

4. Параметры системы теплоснабжения (Gmax; Gmin; Pmax; Pmin; Tmax; Tmin по каждому трубопроводу; диаметры трубопроводов; теплоноситель).

5. Допускаемые потери давления при установке расходомеров.

6. Место установки, условия окружающей среды.

7. Объем диспетчеризации.

закрыть

Какая информация необходима для проведения диагностики УУТЭ?

1. База настроечных параметров, полученная непосредственно из тепловычислителя посредством программ Конфигуратор или Database.

2. Архивы тепловычислителя.

3. Схема автоматизации УУТЭ.

4. Схема внешних соединений УУТЭ.

5. Копии паспортов датчиков расхода, температуры, давления.

6. ТУ на проектирование УУТЭ.

закрыть

При использовании накопителя АДС91 и адаптера АПС78 приобретенного с АДС90 не удается считать данные с СПТ943.1

Адаптер АПС78, приобретенный совместно с АДС90 не может использоваться с накопителем АДС91. На корпусе АПС78 совместимого с АДС91 имеется надпись: «для работы с АДС91»

закрыть

Не удается получить архивные данные с СПТ941.20 при помощи накопителя АДС90 и адаптера АПС78.

В связи со снятием накопителей АДС90 с производства, поддержка накопителями новых приборов НПФ ЛОГИКА, в частности, СПТ941.20 и СПТ943.1 с версиями ПО 2.0.0.3.00 и выше, не предусмотрена. Функции считывания данных с вышеперечисленных приборов полностью реализованы в новом изделии НПФ ЛОГИКА - накопителе АДС91.

закрыть

Каким образом можно организовать передачу данных в сети Интернет от тепловычислителей СПТ 943.2; СПТ 961 и корректора СПГ 763 с выходом на интерфейс Ethernet по протоколу ARP-TCP/IP?

Для организации передачи в сети Интернет данных, получаемых от приборов энергоучета в системах сбора данных, диспетчеризации и мониторинга объектов потребления и производства энергоресурсов предназначены адаптеры АДС 99, которые обеспечивают объединение всех модификаций тепловычислителей СПТ941, СПТ943, СПТ961, корректоров СПГ741, СПГ742, СПГ761, СПГ762, СПГ763 и сумматоров СПЕ542 с выходом на интерфейс Ethernet по протоколу ARP-TCP/IP.

закрыть

Каким образом можно организовать передачу данных в сети Интернет от тепловычислителей СПТ 941.10; СПТ 961.2 и корректора СПГ 742 находящихся на расстоянии 160/120 м. друг от друга по протоколу PPP-TCP/IР?

Для организации передачи в сети Интернет данных, получаемых от приборов энергоучета в системах сбора данных, диспетчеризации и мониторинга объектов потребления и производства энергоресурсов предназначен адаптер АДС 98, который обеспечивает объединение всех модификаций тепловычислителей СПТ941, СПТ943, СПТ944, СПТ961, СПТ962, корректоров СПГ741, СПГ742, СПГ761, СПГ762, СПГ763 и сумматоров СПЕ542 с выходом на интерфейс RS232 по протоколу PPP-TCP/IР.

закрыть

Возможно ли подключение тепловычислителя СПТ944 непосредственно к ПК по интерфейсу RS-232, или необходимо использовать адаптер?

Для непосредственного подключения к COM-порту компьютера одиночных приборов, например СПТ944, по интерфейсу RS-232 используется адаптер АПС77, обеспечивающий гальваническое разделение прибора и компьютера. Адаптер устанавливается в непосредственной близости от прибора. Безадаптерное подключение к COM-порту компьютера по интерфейсу RS-232 допускается только в лабораторных условиях.

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

закрыть

Как настроить корректор СПГ761 для возможности получения параметров теплоснабжения и архивных данных на ПК через адаптер АПС79?

Адаптер АПС79 предназначен для работы с сетью приборов и позволяет подключить компьютер по интерфейсу RS485 к сети, состоящей из приборов СПТ961, СПТ961М, СПТ962, СПГ761, СПГ762, СПГ763. Приборы в сети объединяются двухпроводной линией связи, которая на аппаратном уровне соответствует стандарту RS485, а по логической организации представляет собой шину с маркерным доступом. Конфигурация сети может быть шинной, звездообразной, древовидной.

Скорость обмена в сети - от 300 до 4800 бит в секунду. Суммарная длина всех сегментов может достигать 10 км. В сети обеспечивается информационный обмен между 30 абонентами. Адаптер является программируемым и позволяет в пределах сети по заданному списку передавать измеренные значения отдельных параметров, например, значения температуры и давления холодной воды, от одних приборов к другим. Обмен с приборами через адаптер АПС79 поддерживается программами СПСеть®, ПРОЛОГ и ОРС-сервер "ЛОГИКА".

Для подключения одиночного прибора достаточно ввести следующие настройки: Спецификация внешнего оборудования СПГ 761.2 параметр 003=1050000025. Спецификация внешнего оборудования АПС 79 параметр 003=1050001025.

закрыть

Как перенести архивные данные, считанные накопителем АДС 90 в ПК не имеющий СОМ-порта?

1. Приобрести преобразователь интерфейсов USB-RS232.

2. Подключить преобразователь интерфейсов USB-RS232 к ПК.

3. Установить драйвера для преобразователя интерфейсов USB-RS232.

4. Убедиться что преобразователь интерфейсов USB-RS232 опознан компьютером как СОМ-порт. Запомнить номер СОМ-порта.

5. Открыть программу Пролог (если программа не установлена, то установить, воспользовавшись компакт-диском или сайтом сайт). В настройках программы «Сервис-Настройки-Связь» установить номер СОМ-порта.

6. Для загрузки данных из накопителя АДС90 необходимо подключить его посредством коннектора К228 к преобразователю интерфейсов USB-RS232. По команде «Связь-Опросить АДС90» новые данные будут загружены в архив программы.

закрыть

На каком максимальном расстоянии от корректора СПГ 761.2 и тепловычислителя СПТ 941.20 устанавливаются адаптеры АДС 98 и АДС 99?

Протяженность магистрали Ethernet не должна превышать 200 м. Протяженности магистралей RS485 и М4 определяются количеством подключенных к ней абонентов, параметрами кабеля, скоростью передачи данных и составляют от 0,8 до 12 км. При локальном обмене данными в качестве ведущего абонента может выступать устройство, оснащенное портом RS232C, в этом случае, протяженность линии связи не должна превышать 100 м.

Подробные данные о протяженности магистралей приведены в документах "Магистральный протокол СПСеть. Руководство программиста" и "Магистральный протокол M4. Руководство программиста", размещенных на www.logika.spb.ru.

закрыть

Каким образом автоматизировать учет потребления электроэнергии с разбивкой по цехам и сменам?

Для автоматизированного учета (коммерческого и технического) электрической энергии и мощности на промышленных предприятиях и предприятиях энергетики предназначен Сумматоp СПЕ542. Сумматор ориентирован на работу со счетчиками электрической энергии, снабженными устройствами преобразования измеренного значения энергии в числоимпульсный сигнал (датчиками импульсов). Сумматор позволяет организовать учет потребления энергии в условиях действия двухставочных тарифов, когда измеряется не только электроэнергия, но и мощность в часы пиковых нагрузок, а также учет потребления энергии в условиях действия тарифов, дифференцированных по зонам суток (например так, как это принято на Федеральном оптовом рынке электрической энергии и мощности).

Прибор обеспечивает возможность подключения датчиков импульсов АДС68, Е440, Е440.01, Е870, МХ-1, Ж7АП1 и других. Сумматор позволяет обслуживать до 128 каналов опорных счетчиков, которые могут быть объединены в группы общим числом до 32. Шестнадцать импульсных каналов могут быть подключены непосредственно к СПЕ542, остальные – через пространственно разнесенные и соединенные с СПЕ542 по интерфейсу RS-485 адаптеры АДС84. К каждому адаптеру АДС84 может быть подключено до 16 импульсных каналов. Вместо датчиков импульсов к соответствующим входам сумматора и адаптеров АДС84 могут быть подключены датчики телесигнализации. Сумматор и каждый адаптер АДС84 могут формировать до 4 выходных двухпозиционных сигналов, предназначенных для сигнализации и управления нагрузками.

закрыть

Параметры и количество каких газожидкостных нестабильных углеводородных смесей можно контролировать и учитывать при помощи СПГ 763.2?

Корректоры СПГ 763.2 применяются в составе измерительных систем (комплексов) для учета:

  • жидкостных стабильных углеводородных газовых конденсатов, включающих пентан и более тяжелые углеводороды (С5Н12+); жидкостных однородных углеводородных смесей (продукты переработки газовых конденсатов и широких фракций легких углеводородов);
  • газожидкостных нестабильных газовых конденсатов, в том числе деэтанизированных (без СН4 и С2Н6 или при их суммарном содержании не более 1 % массы) и дебутанизированных (без СН4, С2Н6, С3Н8, С4Н10), включающих, помимо С5Н12+, легкие углеводороды до бутана включительно;
  • неуглеводородные компоненты N2, CO2, H2S, RSH, CH3OH, механические примеси и H2O, газожидкостных нестабильных (сырых) углеводородных смесей с суммарным содержанием СН4 и С2Н6 не более 3 % массы;
  • неуглеводородных компонентов N2, CO2, H2S, RSH, CH3OH, механических примесей и H2O (широкие фракции легких углеводородов);
  • газовых смесей, содержащих углеводородные компоненты до гептана включительно и неуглеводородные компоненты N2, CO2, H2S, Н2О, О2 (влажный нефтяной газ).
закрыть

Чем же он удивительный? Я знаю пару десятков языков и для меня не проблема изучить еще один новый, я просто уже не вижу необходимости.

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

Пролог - уникален по своей природе, он появился благодаря счастливому совпадению (таинственному устройству мира). Когда-то в 60-х годах очень бурно развивалась теория автоматического доказательства теорем и Робинсоном был предложен алгоритм резолюций, который позволял доказать любую верную теорему (вывести из аксиом) за конечное время (за какое не известно). Как оказалось позже, это наилучшее решение общей задачи, невозможно доказать теорему за ограниченное число операций. Простыми словами, алгоритм представляет собой обход (в общем случае бесконечного) графа в ширину, естественно, что предсказуемость работы алгоритма практически равно 0, соответственно для Языка Программирования - это абсолютно не подходит. И в этот момент Кальмэроу нашел блестящее сужение задачи, благодаря которому доказательство некоторых теорем выглядело как процедурное исполнение программы. Стоит отметить, что класс доказуемых теорем достаточно широк и очень хорошо применим для класса программируемых задач. Вот так в 1972 появился Prolog.

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


Главной чертой Prolog является то, что его можно легко читать, но очень тяжело писать, что принципиально отличается от всех mainstream языков, которые так и говорят писать стало еще легче еще один шаг и можно будет писать на планшете, перетягивая рабочие модули как друзей в Google+ , от этого все мы знаем очень сильно страдает само качество кода. Вроде бы каждая строчка понятна, но как система работает за гранью понимания даже для разработчиков, как говорится наиндусили. Мне кажется во всех книгах по обучению Prolog, делают одну и ту же ошибку, начиная рассказ о фактах, отношениях, запросах и у человека складывается отношение к языку как к Экспертной Системе или Базе Данных. Гораздо важнее научится правильно читать программы и почитать так с десяток:)

Как правильно читать программы на прологе

Читать программы очень просто, так как в языке очень мало специальных символов и ключевых слов и они легко переводятся на естественный язык. Главная ошибка программиста, что он хочет сразу представить как программа работает, а не прочитать, что программа описывает, поэтому мне кажется обучить незатуманенный мозг обычного человека, гораздо проще чем програмиста.
Понятия
В языке существует 2 понятия предикаты (условия) и объекты (они же переменные и термы). Предикаты выражают некоторое условие, например объект зеленый или число простое, естественно что условия имеют входные параметры. Например green_object(Object) , prime_number(Number) . Сколько в предикате параметров, такова и арность предиката. Объектами - являются термы, константы и переменные. Константы - это числа и строки, переменные - выражают неизвестный объект, возможно искомый, и обозначаются как строчки с большой буквы. Оставим пока термы и рассмотрим простейшую программу.
Программа
Программа - это набор правил, вида Если условие1 и условие2 и… то верно условие. Формально эти правила объединяются через И, но противоречие получить невозможно, так как в Прологе отсутствует логическое отрицание, а в связке То может присутствовать только один предикат (условие).

A:- B_1, B_2. % правило читается как: Если B_1 и B_2, то A
нечетное_простое(Число) :- простое(Число), нечетное(Число).
% Если "Число" - простое и нечетное, то "Число" - нечетное_простое

Как видно имя переменной имеет область видимости - это правило. Математически верно, правило звучит: для любой переменной - «Число», если оно простое и нечетное, то оно простое_нечетное. Аналогично, можно перефразировать так: Если существует «Число», что оно нечетное и простое, то оно нечетно_простое. Поэтому имя переменной очень важно! Если в левой части (до:-) заменить Число на Число2, то правило поменяет смысл: Для любого Число2 и Число, если Число - простое и нечетное, то Число2 - простое нечетное. Получается все числа простые_нечетные! Это самая распространенная ошибка в Прологе.

A:- B_1, B_2. % правило читается как: Если B_1 и B_2, то A нечетное_простое(Число) :- простое(Число), нечетное(Число). % Если "Число" - простое и нечетное, то "Число" - нечетное_простое

Пример - совершенные числа
совершенное_число(Ч) :- число(Ч), сумма_делителей_без_числа(Ч, СуммаДелителей), равно(СуммаДелителей, Ч). совершенное_число(1). равно(Объект, Объект). сумма_делителей_без_числа(1, 1). сумма_делителей_без_числа(Число, Сумма) :- число_предыдущее(Число, Предыдущее), сумма_делителей_числа_до_числа(Число, Сумма, Предыдущее). сумма_делителей_числа_до_числа(Число, 1, 1). сумма_делителей_числа_до_числа(Число, Сумма, Делитель) :- делится_на(Число, Делитель), число_предыдущее(Делитель, Предыдущее), сумма_делителей_числа_до_числа(Число, СуммаПред, Предыдущее), сложить(СуммаПред, Делитель, Сумма). сумма_делителей_числа_до_числа(Число, Сумма, Делитель) :- не_делится_на(Число, Делитель), число_предыдущее(Делитель, Предыдущее), сумма_делителей_числа_до_числа(Число, Сумма, Предыдущее).

Для начала формально прочитаем, что означают правила:

  1. Если «Ч» - число и для «Ч» и «СуммаДелителей» выполняется условие сумма_делителей_без_числа, проще говоря СуммаДелителей есть сумма делителей числа «Ч», и «Ч» равно «СуммаДелителей», то «Ч» совершенное число.
  2. 1 - совершенное число. Правила могут не иметь условий, в этом случае они называются фактами.
  3. Всякий объект «О» равен «О». В принципе существует, стандартный предикат "=", но можно вполне заменить на свой.
  4. Факт сумма_делителей_без_числа 1 равна 1.
  5. Если сумма делителей «Число» до предыдущего числа «Число» равна «Сумма», то это и есть сумма_делителей_без_числа. Таким образом выражается, сумма делителей X меньше либо равных Y, так как X делится на X, поэтому берем Y = X - 1.
  6. Далее 3 предиката определяют сумму делителей число меньше либо равных Y (Делитель), 1-й случай Y равное 1, 2-й случай Число делится на Y, тогда сумма_делителей(X, Y) = сумма_делителей(X, Y-1) + Y, и 3-й случай Число не делится на Y, тогда сумма_делителей(X, Y) = сумма_делителей(X, Y-1).
Программа - как набор определений
Существует второй способ прочтения данных правил, менее математический и более естественный, основанный на «определениях». Можно заметить, что в Прологе все правила слева (в части то) содержат только одно условие, что по сути является «определением» это условия.
Например, 1-ое правило определение совершенных чисел. «Ч» совершенное число, когда «Ч» число и сумма делителей «Ч» равна «Ч». Одинаковые предикаты группируются по имени объединяясь условием «или». То есть к определению можно добавить: «Ч» совершенное число, когда.., или когда «Ч» - это 1.

Данный способ чтения широко применяется, так как позволяет объединять предикаты в однородные группы и помогает понять, в каком же порядке интерпретатор раскручивает предикаты, для того, чтобы
проверить истинность некоторого утверждения. Например, очевидно, что если предикат не имеет ни одного определения, то доказать истинность утверждения с ним невозможно. В примере № 1 не имеет определения предикат «делится_на».

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

Термы
Термы имеют рекурсивное определение, как именованная совокупность объектов. Терм = "имя"(объект, объект, ...), пример person("Name", "Surname"), "+"(1, 2), person(address("Некоторый адрес"), surname("Фамилия"), phone("Телефон")) . Если рассматривать терм, как математическое понятие, то терм является функцией, а точнее функтором, то есть "+"(1, 2) - означает, что существует такой объект, который равен 1+2. Это абсолютно не означает, что 1+2 = 3, в Прологе - это выражение неистинно, точно так же как и в группе остатков по модулю 2, там 3 вообще не существует. Опять же с математической точки зрения Переменные связываются словом Для Всех, а если в утверждении необходимо слово существует то, для этой цели применяется терм (функтор). Для любого числа существует число-факториал:- factorial(X, fact(X)).

С точки зрения программирования терм можно объяснить гораздо проще: терм - это объект с набором атрибутов, атрибуты могут быть другими термами или константами или переменными (то есть не определены). Главное отличие, все объекты в Prolog immutable, то есть менять атрибуты в них нельзя, зато есть специальное состояние - переменная.

Пример - целочисленная арифметика
нат(0). нат(число(Число)) :- нат(Число). плюс(0, Число, Число). плюс(число(Ч1), Ч2, число(Рез)) :- плюс(Ч1, Ч2, Рез). умножить(0, Число, 0). умножить(число(Ч1), Ч2, Рез2) :- умножить(Ч1, Ч2, Рез), плюс(Рез, Ч2, Рез2).
  1. Определение свойства нат (натуральное число). 0 - натуральное число, если Число натуральное, то существует объект число(Число), которое тоже является натуральным. Математически терм «число» выражает функцию +1, с точки зрения программирования «число» рекурсивная структура данных, вот ее элементы: число(0), число(число(0)), число(число(число(0))).
  2. Отношение плюс - 0 + Число = Число. Если Ч1 + Ч2 = Рез, то (Ч1+1) + Ч2 = (Рез+1).
  3. Отношение умножить - 0 * Число = 0. Если Ч1 * Ч2 = Рез и Рез + Ч2 = Рез2, то (Ч1+1) * Ч2 = Рез2.
Очевидно эти утверждения верны для обычной арифметики, но почему тогда мы не включили такие же очевидные как Число + 0 = Число. Ответ простой: избыточность очень плохо для любого определения. Да, это может помогать вычислениям, своеобразная преждевременная оптимизация, но побочными эффектами могут быть противоречия в определениях, неоднозначный вывод утверждения, зацикливание интерпретатора.

Как Prolog понимает предикаты и как доказывает утверждения

Конечно чтение программ, помогает ощутить стиль Пролог, но не делает понятным для чего и как данные определения могут использоваться. Полноценной программой, примеры приведенные выше, назвать нельзя так как не хватает входной точки. Входной точкой в Пролог является запрос, аналог запроса к базе данных SQL или аналог вызова главной функции в функциональном программировании. Примеры запросов: нат(Число) - найти натуральное число, плюс(0, 0, Результат) - найти результат сложения 0 и 0 в переменной Результат, нат(0) - проверить является ли 0 натуральным числом и др.

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

Рассмотрим на примере запроса плюс(0, 0, Результат) :
1. Находим совпадение (своеобразный pattern-matching, резолюция) данного запроса с левой частью одно из правил. Для данного запроса плюс(0, Число, Число). Соотнесем поочередно все аргументы запроса с правилом и получим: 0 = 0, 0 = Число, Результат = Число. В этих уравнениях участвуют 2 переменные (Число и Результат), решив их мы получаем, что Число = Результат = 0. Так как у данного правила нет условий, мы получили ответ на заданный вопрос. Ответ: да и Результат = 0.

Запрос нат(Число) :
1. Находим 1-е совпадение с правилом, правило нат(0), решая уравнения по соответствию, проще говоря находя резолюцию, мы получаем Число = 0. Ответ: да и Число = 0.

Запрос плюс(Результат, 0, число(0)) :
1. Находим резолюцию с правилом плюс(0, Число, Число): Результат = 0, 0 = Число, число(0) = Число, но (!) Число = 0 = число(0) - не возможно так как 0 совпадает число(0). Следовательно ищем резолюцию со следующим правилом.
2. Находим резолюцию с правилом плюс(число(Ч1), Ч2, число(Рез)), получаем число(Ч1) = Результат, Ч2 = 0, число(Рез) = число(0), отсюда Рез = 0. У этого правила, есть условия которые мы должны проверить, учитывая результаты резолюции (значения переменных), плюс(Ч1, Ч2, Рез) -> плюс(Ч1, 0, 0). Запоминаем значение переменных в стеке и формируем новый запрос плюс(Ч1, 0, 0)
3*. Решая запрос плюс(Ч1, 0, 0) находим резолюцию с плюс(0, Число, Число) и получаем Ч1 = 0 и Число = 0.
4. Возвращаемся по стеку к предыдущим переменным Результат = число(Ч1) = число(0). Ответ найден число(0). Соответственно сейчас пролог машина решила уравнение X + 0 = 1.

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

Пример запроса плюс(Число, Число, Число) : ответ да, Число = 0.

Пример запроса плюс(0, 0, 0) : ответ нет, при первой же попытке все резолюции не выполняются.

Пример запроса плюс(Число, Число, число(Число)) : ответ да, Число = 1. Решение уравнения X + X = X + 1.

Попробуйте провести вывод для умножить(Число, число(0), число(0)), для этого потребуется 2 раза заносить в стек переменные и вычислять новый запрос. Суть Пролог машины такова, что вы можете отказаться от 1-го результата, тогда Пролог вернется к предыдущему состоянию и продолжит вычисление. Например запрос нат(Число) , сначала применит 1-е правило и выдаст 0, а затем применит 2-е правило + 1-е правило и выдаст число(0), можно повторить и получить бесконечную последовательность всех натуральных чисел. Другой пример, запрос плюс(Число, число(0), Число2) , будет выдавать последовательность всех пар решения уравнения X + 1 = Y.

Заключение

К сожалению, разумный размер топика, не дал мне подобраться к главной теме, а именно к решению сложных логических задач на языке Пролог, не обладая стратегией их решения. Большие куски кода на Прологе могут отпугнуть не только начинающих, но даже опытных программистов. Цель данной статьи показать, что программы на Прологе могут простым образом читаться на естественном языке , а также исполняться простейшим интерпретатором .
Главная особенность Пролога - это не черный ящик и не библиотека, который решает сложные логические задачи, в Mathematica можно ввести алгебраическое уравнение и она выдаст решение, но последовательность выполняемых шагов - неизвестна. Пролог не может решать общие логические задачи (у него отсутствует логическое «или» и «отрицание»), иначе бы его вывод был недетерминированный как линейной резолюции. Пролог - это золотая середина, между простым интерпретатором и машиной для доказательства теорем, сдвиг в любую сторон приводит к потери одного из свойств.

В следующей статье я бы хотел рассказать, как решаются задачи сортировки, о последовательности переливаний, Miss Manners и другие известные логические задачи. Для тех, кто почувствовал себя неудовлеторенным хочу предложить следующую задачу (решившему первым приз ):
Написать предикат , который бы генерировал, бесконечную последовательность натуральных чисел, начиная с 3. Это должны быть стандартные числа в Прологе, операции над которыми выполняются при помощи предиката is: X is 3 + 1 => X=4.

ГЛАВА 10. ПРОЛОГ И МАТЕМАТИЧЕСКАЯ ЛОГИКА

Язык программирования Пролог был разработан коллективом во главе с Колмерауэром приблизительно в 1970 году. Это была первая попытка в разработке языка, который позволял бы программисту описывать свои задачи средствами математической логики, а не с помощью традиционных для программирования конструкций, указывающих что и когда должна делать вычислительная машина. Эта идея нашла отражение в названии языка программирования «Пролог» (английское название «Prolog» является сокращением для Programming in Logic. - Перев.).

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

Из книги Прикладные свободные программы и системы в школе автора Отставнов Максим

Из книги Свободные программы и системы в школе автора Отставнов Максим

0.3 Логика и последовательность освоения СПО Логика и последовательность изложения материала в этом курсе существенно отличается от логики, в которой написано большинство книг, посвященных СПО.Чаще всего авторы исходят из того, что последовательность внедрения программ

Из книги Давайте создадим компилятор! автора Креншоу Джек

Из книги Программирование на языке Пролог автора Клоксин У.

ГЛАВА 8. ОТЛАДКА ПРОЛОГ-ПРОГРАММ На приведенных выше примерах вы уже приобрели опыт применения программ и научились их изменять, а также успели написать и свои собственные программы. Теперь самое время заняться вопросом: что делать, когда программа ведет себя не так, как

Из книги Разгони свой сайт автора Мациевский Николай

Логика для скрипта, запускающегося по расписанию Загрузить и разобрать http://s3.amazonaws.com/application/?actions=loadlist .Если текущий сервер отсутствует в списке, создать пустой файл в сегменте с ключом servers/{IP-адрес EC2-сервера}.Выяснить, доступны ли остальные серверы, записанные в сегменте,

автора Реймонд Эрик Стивен

Из книги Об интеллекте [другая версия перевода книги] автора Хокинс Джефф

Пролог Эта книга и моя жизнь наполнены двумя моими увлечениями.В течение 25 лет я был увлечен мобильными компьютерами. В мире высоких технологий Силиконовой Долины я известен как зачинатель двух проектов - Palm Computing и Handspring, и как разработчик множества наладонных

Из книги Феномен науки. Кибернетический подход к эволюции автора Турчин Валентин Фёдорович

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

Из книги Ководство автора Лебедев Артём Андреевич

19.3. Логика лицензирования: как выбрать лицензию Выбор лицензионного соглашения предполагает решение о том, какие ограничения, если они есть, налагаются автором на использование созданного им программного обеспечения.Если разработчик вообще не хочет ограничивать

Из книги Программирование на языке Пролог для искусственного интеллекта автора Братко Иван

§ 109. Логика и эстетика 20 октября 2004Два основных понятия в дизайне - логика и эстетика. Один дизайнер, решив все логические задачи, приходит в результате к эстетическому финалу. Другой - наоборот. (Есть, конечно, и третий, кому медведь наступил на все органы чувств, но он не

Из книги Деловая e-mail переписка. Пять правил успеха автора Воротынцева Тамара

Из книги Справка по SQL автора

Глава 2 Синтаксис и семантика Пролог-программ В данной главе дается систематическое изложение синтаксиса и семантики основных понятий Пролога, а также вводятся структурные объекты данных. Рассматриваются следующие темы: простые объекты данных (атомы, числа,

Из книги Новый ум короля [О компьютерах, мышлении и законах физики] автора Пенроуз Роджер

ПРЕДИСЛОВИЕ

При использовании ЭВМ для решения задач можно выделить два взаимосвязанных способа представления знания:

1) процедурное представление, т. е. определение алгоритма обработки данных;

2) декларативное представление, т. е. определение отдельных понятий, их состояния в конкретные моменты времени и связей между ними.

Традиционные алгоритмические языки (Паскаль, Си, Фортран) являются процедурными, поскольку их цель – описание алгоритма. Но они содержат и декларативные компоненты (описание переменных).

В языке ПРОЛОГ (ПРОграммирование ЛОГическое), напротив, основной является декларативная компонента, так что он предназначен не столько для обработки данных, как для обработки фактов и декларативных правил. Факты представляют собой логические формулы. База знание (БЗ) задается совокупностью таких формул. Логические методы обеспечивают получение новых фактов из фактов, представленных в БЗ.

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

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

ПРОЛОГ может использоваться при разработке экспертных систем, а также для следующих задач:

– доказательства теорем и вывода решений в задачах;

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

– разработки упрощенных версий систем ИИ;

– создания естественно-языковых интерфейсов для существующих программ;

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

ПРОЛОГ появился в 1973 г., когда группа исследователей из Марсельского университета под руководством Алана Колмероэ, создала программу для доказательства теорем, которая была реализована на языке Фортран. Впоследствии этот продукт получил название ПРОЛОГ. Первые годы ПРОЛОГ не находил широкого практического применения. Однако в 1981 г. было объявлено о японском проекте создания ЭВМ пятого поколения, в основе программного обеспечения которых предполагалось использовать логическое программирование. Этот проект создания ЭВМ для обработки знаний вызвал большой резонанс во всем мире. Появились коммерческие реализации ПРОЛОГа, такие как CProlog, Quintus Prolog, Silogic Knowledge Workbench, Тurbo Prolog и др.

Наибольшую популярность в нашей стране получила система программирования Turbo Prolog – один из продуктов известной фирмы Borland. В 1988 г. был выпущен Turbo Prolog 2.0, получивший широкое распространение. Фирма Borland распространяла эту версию до 1990 г.,

а затем компания PDC приобрела права на этот продукт, получивший название PDC Prolog. Позднее был выпущен Visual Prolog, оснащенный стандартными возможностями для быстрого проектирования интерфейса.

В декабре 1997 г. фирма PDC выпустила Visual Prolog 5.0, а с января 1999 г. приступила к распространению версии 5.1. В настоящее время все желающие могут бесплатно скопировать через Internet последнюю версию системы Visual Prolog 5.1 Personal Edition, функционирующую в средах Windows 3.1/95/98, NT, OS/2, SCO UNIX и Linux. Ее загрузочный файл объемом 20 Мбайт можно найти по адресам: http://www.visual-prolog.com/ vip/vipinfo /freeware version.htm, http://www.pdc.dk/vip/vipinfo/freeware version.htm. Вариант Personal Edition предназначен для некоммерческого использования, и сообщения об этом имеются во всех приложениях, созданных с его помощью. Кроме того, владельцы Personal Edition не обеспечиваются бесплатной технической поддержкой и на них не распространяются льготы и скидки при приобретении новых версий. В последней версии появились такие усовершенствования, как отладчик, специальный инструментарий и примеры разработки Web-узлов.

Для учебных целей вполне пригоден Turbo Prolog. На использование этой реализации языка рассчитаны все приводимые примеры и задачи.

1. ТЕОРЕТИЧЕСКИЕ ПРИНЦИПЫ ПРОЛОГА

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

Обозначаются предикаты F(x), F(x, y), F(x, y, z) и т. д.. Одноместный предикат F(x), определенный на предметной области

M, является истинным, если у объекта x есть свойство F, и ложным – если этого свойства нет.

Двухместный предикат F(x, y) является истинным, если объекты x и y находятся в отношении F.

Многоместный предикат F(x1 , x2 , x3 ,..., xN ) задает отношение между элементами x1 , x2 , ..., xN и интерпретируется как обозначение высказывания: “Элементы x1 , x2, xN находятся между собой в отношении F”.

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

Примеры предикатов:

хищник (Х)

супруги (X,Y)

Предикаты, которые нельзя разбить на отдельные компоненты, называют атомарными. Сложные формулы строятся путем комбинирования атомарных предикатов логическими соединителями И, ИЛИ и НЕ.

Одноместный предикат при подстановке в него значения переменной становится «нульместным», т.е. высказыванием-предложением, которое является истинным или ложным:

хищник (тигр).

При подстановке в n-местный предикат конкретного значения его местность становится равной n–1. Таким образом, каждое высказыва-

ние порождается некоторым предикатом, а каждый предикат соответствует множеству высказываний.

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

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

(А1 А2 А3 ... Аn )→ В.

На практике удобно использовать доказательство от противного, т. е. доказывать невыполнимость. Если A → B истинно, тоA → B ложно и AB ложно.

На этом основан принцип резолюции, который требует представления формул исчисления предикатов в виде набора дизъюнктов, связанных операцией конъюнкции [конъюнктивная нормальная форма (КНФ)].

Правило резолюции имеет вид

(X A) (A Y)→ (X Y).

Правило резолюции позволяет соединить две формулы, из одной удалив А, а из другой A . В этом случае говорят, что A иA резольвируют.

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

(А1 А2 А3 ... Аn )→ B , можно сделать вывод, что В истинно.

Рассмотрим пример использования метода резолюции, применяя доказательство от противного.

Пусть необходимо доказать истинность выражения ((P Q) (P→ R) (Q→ S))→ (R S).

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

1. Приводим посылки к нормальной форме (без → и↔ ) P Q;

P R;

Q S.

2. Записываем в нормальной форме отрицание заключения

(R S) = R S ;

3. Рассматриваем конъюнкцию пяти дизъюнктов

R (RP ) (P Q)S (Q S)

Первые два дизъюнкта дают P , что в сочетании с третьим дизъюнктом дает Q. Четвертый и пятый дизъюнкты даютQ .

Таким образом, имеем

Q Q = FALSE.

Таким образом, доказано ((P Q) (P→ R) (Q→ S))→ (R S), поскольку противоположное неверно.

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

2. СТРУКТУРА ПРОГРАММЫ НА ПРОЛОГЕ

Программа на языке ПРОЛОГ включает следующие основные разделы: описание имен и структур объектов (domains);

описание предикатов – названий отношений, существующих между объектами (predicates);

раздел целевых утверждений (goal), который может отсутствовать; в этом случае программа будет запрашивать целевое утверждение при запуске;

описание фактов и правил, описывающих отношения (clauses). Имена объектов (констант) в ПРОЛОГе пишутся с маленькой буквы,

а переменных – с большой.

Рассмотрим, как можно описать на ПРОЛОГе задачу из некоторой предметной области, например географии.

Программа 1

situ(gorod,strana) CLAUSES

situ (london, england). situ (petersburg, russia). situ (kiev, ukraine). situ (pekin, asia).

situ (warszawa, poland). situ (berlin, europe).

situ (X, europe):- situ (X, russia). situ (X, europe):- situ (X, poland).

Выражение

situ(kiev, ukraine)

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

gorod, strana = symbol PREDICATES

situ(gorod,strana)

можно было просто описать предикат: PREDICATES

situ(symbol, symbol)

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

В конце раздела clauses Программы 1 описаны два правила. Правило задает новый предикат через предикаты, определенные ранее. Правило 6

состоит из головы (предиката) и тела – последовательности предикатов. Голова отделяется от тела значком:- , который можно интерпретировать как слово «Если». Таким образом, заключение является головой правила, а тело правила состоит из набора посылок.

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

Смысл правила состоит в том, что цель, являющаяся головой, будет истинной, если интерпретатор ПРОЛОГа сможет показать, что все выражения (подцели) в теле правила являются истинными.

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

Так, правило

situ (X, europe):- situ (X, poland)

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

situ (X, europe):- situ (X, france)

и можно будет по-прежнему использовать все остальные факты о городах Европы.

В ПРОЛОГе можно использовать составные объекты. Составные объекты позволяют описывать иерархические структуры, в которых описание одного предиката включает в себя описание других предикатов.

Например:

Программа 2

DOMAINS personal_library=book(title,author,publication) publication= publication(publisher,year)

collector,title,author,publisher=symbol

year=integer PREDICATES

collection(collector, personal_library)

collection(“Иванов”,book(“Война и мир”, “Лев Толстой”, publication(“Просвещение”,1990))).

При описании правил часто возникает необходимость использовать логические связки И и ИЛИ. В качестве связки И используется запятая, а в качестве связки ИЛИ – точка с запятой. Например:

gigant(X) :- rost(X,Y),Y>200.

star_or_mlad(X) :- X>70; X<10.

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

Часто используемыми встроенными предикатами являются = (унификация) и логическое отрицание not. Например:

student(X) :- X=”Петров”; X=”Иванов”.

xor_student(X) :- not(X=”Петров”), not(X=”Иванов”).

planeta(X) :- not(X=”солнце”).

Утверждение not(X = Y) эквивалентно X<>Y.

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

ПРОЛОГ-программа может использовать комментарии, которые не влияют на выполнение программы, но могут оказать помощь человеку, читающему программу. ПРОЛОГ игнорирует произвольное число строк, заключенное между символами /* и */. Все, что находится между % и концом строки, также рассматривается как комментарий:

/* Здесь записан комментарий */

% Это тоже комментарий

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

Рассмотрим, каким образом на ПРОЛОГе можно описать задачу о семейных отношениях.

Пусть имеются факты об отцовстве:

1) Иван – отец Игоря.

2) Иван – отец Сидора.

3) Сидор – отец Лизы. Введем также три предиката:

Мужчина (x), означающий, что x – мужчина, Единокровный (x,y), означающий единокровность x и y, Брат (x,y), означающий, что x брат y.

Справедливы, очевидно, следующие правила:

1) «Все отцы – мужчины».

2) «Если у детей один отец, то они единокровны».

3) «Брат – это единокровный мужчина». Рассмотрим вывод решения при ответе на вопрос: «Есть ли братья у Игоря?».

Программа 3

person = symbol PREDICATES

otec(person,person)

brat(person,person) CLAUSES

man(X):-otec(X,_). brat(X,Y):-otec(Z,Y),otec(Z,X),man(X),X<>Y. otec(ivan,igor). otec(ivan,sidor). otec(sidor,lisa).

Во втором правиле программы указано условие X<>Y. Это позволяет описать ПРОЛОГ-программе тот факт, что человек не может быть собственным братом.

После запроса

goal: brat(igor,X) Система выдаст

Это отвечает нашим представлениям о правильном решении. Приведенные примеры примитивны, но они позволяют представить

неожиданность и полезность решений, которые может сгенерировать ПРОЛОГ при большом количестве фактов и правил в сложной предметной области.

3. ОПИСАНИЕ АРИФМЕТИЧЕСКИХ ОПЕРАЦИЙ

В языке ПРОЛОГ используется ряд встроенных функций для вычисления арифметических выражений, некоторые из которых перечислены

в табл. 1.

Таблица 1

Обозначение

Тип операции

>,<,=,>=,<=,<>

Операции сравнения

Арифметические операции

Остаток от деления X на Y

Частное от деления X на Y

Абсолютная величина числа X

Квадратный корень из X

sin(X), cos(X), tan(X), arctan(X)

Тригонометрические функции

Возведение в степень X

Десятичный логарифм (ln) числа X

Натуральный логарифм числа X

Для описания любых операций арифметики можно также использовать собственные предикаты. Например:

Программа 4

PREDICATES add(integer,integer) fadd(real,real) maximum(real,real,real)

add(X,Y):-Z=X+Y,write(“Sum= “,Z),nl. fadd(X,Y):-Z=X+Y,write(“FSum= “,Z),nl. maximum(X,X,X).







2024 © gtavrl.ru.