Адаменко Логическое Программирование

Адаменко Логическое Программирование

PROLOG для программистов Хабрахабр. Язык логического программирования PROLOG далее ПРОЛОГ большинству программистов представляется чем то запутанным и малопригодным для практического применения. В то же время, Интернет основан на символьной информации, поэтому практически все современные программисты сталкиваются с необходимостью обрабатывать символьные структуры данных, а ведь для этого и предназначен язык логического программирования ПРОЛОГ. Этот язык идеальный для работы с символьными структурами, текстовыми файлами и для построения интеллектуальных программ. По моему, высота этого порога образовалась в результате запутанного синтаксиса и нагромождения встроенных процедур. Еще один источник этой высоты высокомерие авторов многочисленных руководств, которые написаны так, будто читатель никогда программ не писал. Думаю, если объяснить без нагромождений, типа декларативной семантики, время вхождения в логическое программирование для обычного программиста не превысит 3. Оба этих аспекта языка коренным образом отличаются от традиционных языков программирования. Но не будем забывать, что логическое программирование реализуется на тех же машинах с фон Неймановской архитектурой. При этом каждая процедура существует в нескольких вариантах и программа сама выбирает себе правильный, точнее говоря, пригодный для каждого конкретного варианта исходных данных вариант реализации тело процедуры. Как определяется пригодность каждый вызов процедуры, во время исполнения программы, по результатам исполнения процедуры, получает логическое значение TRUE или FALSE. Адаменко Логическое Программирование' title='Адаменко Логическое Программирование' />Терминология логического программирования заимствована из логики. Логика познает. Адаменко А. Н., Кучуков А. М. Логическое программирование и. Н., Кучуков А. Название Логическое программирование и Visual Prolog Автор Адаменко. Совокупность процедур с одинаковым именем и арностью называется предикатом. Например, предикат инвертирования списков идентифицируется, как nrev2, а предикат соединения списков как append3. Никакого объявления параметров или переменных не требуется, но можно ограничить параметры паттерном в заголовке процедуры. Например, в одном варианте предиката первый параметр может быть указан как. В этом случае, интерпретатор языка запускает следующий по порядку вариант тела этой процедуры. Если же все варианты оказались непригодными, происходит возврат к предыдущей процедуре и для нее также происходит перебор вариантов, таким образом, вычисление в ПРОЛОГе сводится к обходу дерева вложенности процедур. По существу это откат, поскольку все значения, полученные переменными в отмененной процедуре, отменяются. # Ввод Ключей В Опенбокс F-100 С Пульта. Бэктрекинг уникальное средство данного языка, не имеющее аналогов ни в одном из других массовых языков программирования. Адаменко Логическое Программирование' title='Адаменко Логическое Программирование' />Бэктрекинг обеспечивает полный обход дерева логического вывода, что обеспечивает основу для решения интеллектуальных задач. Алгоритм интерпретации программы выполнения цели в системе ПРОЛОГ. Вход цель pA1,A2. Найти в памяти процедуру по имени p с арностью n. Унифицировать входные параметры цели с заголовком найденной процедуры. Если унификация параметров прошла, выполнить первую цель из тела найденной процедуры. Если унификация не прошла, найти следующий вариант процедуры Pn. Если следующий вариант процедуры Pn не найден, закончить работу с результатом FAIL. Если первая цель выполнилась, перейти к выполнению следующей цели. Если следующая цель не выполнилась, вернуться к предыдущей цели и выполнить следующий вариант ее реализации. Если текущий вариант реализации процедуры Pn не выполнился, перейти к следующему варианту. Если все цели из тела процедуры выполнены, закончить работу с результатом TRUE. В связи с такой структурой вычислений каждый вызов процедуры называется целью, которая может быть достигнута или нет. Всякое вычисление в ПРОЛОГе имеет логическое значение. Вычисление еще называют поиском вывода доказательства, а язык ПРОЛОГ языком логического программирования. Наверное, синтаксически ПРОЛОГ самый простой среди языков программирования. Основной синтаксической процедурой является предикат выражение, аналогичное вызову процедуры имя и список аргументов Px. Имена пишем с малой буквы, а переменные с большой. Если опустить детали, синтаксис ПРОЛОГа можно описать следующим образом lt ПРОЛОГ предложение lt правило. Пример семейные отношения. Определим правила для отношений супруг, ребенок, мать, дочь, брат, потомок. Семейные отношения задаются бинарными и унарными предикатами правилами предикаты с переменными и фактами предикаты с константами. Правила легко понять, поскольку семейные отношения всем понятны. Например, первое правило гласит X является матерью Y, если Y есть ребенок X и X женского пола. X,Y childX,Y,femaleX. X,Y childY,X,femaleX. X,Y childX,Z,childZ,Y. X,Y childX,Y. X,Y grandchildX,Z. Факты описывают родственников конкретной семьи. Заголовок каждого правила является основой построения запросов. Запросы могут быть двух видов проверочный и поисковый. Примеры поисковых запросов Чья дочь Kat Списки основная структура данных, применяемая в этом языке. Списки являются основой для организации всех сложных вычислений. Одно из основных свойств списка отсутствие ограничений на элементы и размер списка. Вложенность списков также ничем не ограничивается. Список в языке трактуется как структура из двух элементов головы и хвоста. Это разделение является основой вычислений над списками, поэтому наиболее часто применяемый паттерн списка имеет вид. Пустой список не содержит элементов и обозначается как. Предикаты удобны для группирования данных в одну смысловую единицу. В отличие от списка, количество аргументов предиката фиксировано. Имя предиката пишется с малой буквы, как и все константы в языке. Переменные всегда начинаются с заглавной буквы. На основе переменных можно строить паттерны для списков. Примеры списковых паттернов. Рекурсивные предикаты имеют не менее двух процедур одна для общего случая, другая для завершения. Рекурсивность списков обеспечивает возможность простой формулировки алгоритма операций над списками. Пример Вычисление длины списка. Нельзя написать L. Логичность переменных приводит к усложнению унификации, поскольку все унификации в теле одной процедуры не могут быть пересмотрены в процессе вычисления, а значит, они не могут противоречить друг другу. Унификация логических переменных приводит к неожиданным эффектам, которые имеют вполне императивное объяснение. Пример варианты использования предиката соединения списков. Соединение append. Вычисление проводится для формулы сложения двух чисел любой длины. При наличии известных цифр можно их вставлять вместо переменных. Если длина слагаемых различна, можно вставить нули в начале соответствующего списка. Предикат sum. 18 использует первые три аргумента для записи результата, аргументы под номером 4,5,6 в качестве рабочих переменных, седьмой аргумент начальное значение разряда переноса, восьмой аргумент список допустимых значений цифр. Предикат dl3 выполняет выбор и удаление последнего элемента из списка переменных. Предикат val3 выбирает допустимое значение из списка оставшихся вариантов, при этом выбранный вариант цифры, удаляется из списка допустимых вариантов. Если вариант значения для очередной буквы устанавливался ранее, то он остается без изменений. Предикат sd5 проверяет вариант заданной тройки цифр одного столбца ABIi CIo1. Если sd5 не выполняется, возникает бэктрекинг последний из вызовов предиката val3 присваивает новое значение переменной E3. Если ни одно из значений E3 не подошло, бэктрекинг продолжается на шаг назад для E2 выбирается новое значение, затем если не подойдет ни один вариант E3 E2, для E1.

Статьи

Адаменко Логическое Программирование
© 2017