Логическое программирование возникло в эру ЭВМ как естественное желание автоматизировать процесс логического вывода, поэтому оно является ветвью теории формальных систем. Логическое программирование (в широком смысле) представляет собой семейство таких методов решения задач, в которых используются приемы логического вывода для манипулирования знаниями, представленными в декларативной форме [1]. Как писал Джордж Робинсон в 1984 году, в основе идеи логического программирования лежит описание задачи совокупностью утверждений на некотором формальном логическом языке и получение решения с помощью вывода в некоторой формальной (аксиоматической) системе. Такой аксиоматической системой являются исчисление предикатов первого порядка, поэтому в узком смысле логическое программирование понимается как использование исчисления предикатов первого порядка в качестве основы для описания предметной области и осуществления резолюционного логического вывода.
Язык Пролог объединяет два подхода: логический и процедурный. По мнению Дж. Робинсона, в основе идеи логического программирования лежит принцип описания задачи при помощи совокупности утверждений на некотором формальном логическом языке и получение решения при помощи вывода в некоторой формальной системе. Основой языка Пролог является логика предикатов первого порядка.
Пролог — попытка объяснить без программирования
Программа на Прологе включает в себя постановку задачи в виде множества фраз Хорна (раздел clauses) и описание цели (раздел goal), — формулировку теоремы, которую нужно доказать, исходя из множества правил и фактов, содержащихся в этой постановке. Процесс поиска доказательства основан на методе линейной резолюции (дизъюнкты подбираются в порядке их следования в тексте программы).
Язык программирования Пролог (PROgramming LOGic) предполагает получение решения задачи при помощи логического вывода из ранее известных фактов. Программа на языке Пролог не является последовательностью действий – она представляет собой набор фактов и правил, обеспечивающих получение логических заключений из данных фактов. Поэтому Пролог считается декларативным языком программирования.
Одной из важнейших особенностей Пролога является то, что он ищет не только ответ на поставленный вопрос, но и все возможные альтернативные решения. Вместо обычной работы программы на процедурном языке от начала и до конца, Пролог может возвращаться назад и просматривать все остальные пути при решении всех частей задачи.
Программист на Прологе описывает объекты и отношения, а также правила, при которых эти отношения являются истинными. Объекты рассуждения в Прологе называются термами – синтаксическими объектами одной из следующих категорий: • константы, • переменные, • функции (составные термы или структуры), состоящие из имени функции и списка аргументов-термов, имена функций начинаются со строчной буквы. Константа в Прологе служит для обозначения имен собственных и начинается со строчной буквы. Переменная в Прологе служит для обозначения объекта на который нельзя сослаться по имени. Пролог не имеет оператора присваивания.
Работа с программой ПРОЛОГ
16) Факты, правила, вопросы. Сопоставление в ПРОЛОГе.
Переменные в Прологе инициализируются при сопоставлении с константами в фактах и правилах. Переменная остается связанной только то время, которое необходимо для получения решения по запросу, затем Пролог освобождает ее и ищет другое решение.
Переменные в Прологе предназначены для установления соответствия между термами предикатов, действующих в пределах одной фразы (предложения), а не местом памяти для хранения данных. Переменная начинается с прописной буквы или знаков подчеркивания. В Прологе программист свободен в выборе имен констант, переменных, функций и предикатов. Исключения составляют резервированные имена и числовые константы. Переменные от констант отличаются первой буквой имени: у констант она строчная, у переменных – заглавная буква или символ подчеркивания.
Область действия имени представляет собой часть программы, где это имя имеет один и тот же смысл: • для переменной областью действия является предложение (факт, правило или цель), содержащее данную переменную;
• для остальных имен (констант, функций или предикатов) – вся программа. Специальным знаком «_» обозначается анонимная переменная, которая используется тогда, когда конкретное значение переменной не существенно
Отношения между объектами в Прологе называются фактами. Факт соответствует фразе Хорна, состоящей из одного положительного литерала. Факт – это простейшая разновидность предложения Пролога. Любой факт имеет соответствующее значение истинности и определяет отношение между термами.
Факт является простым предикатом, который записывается в виде функционального терма, состоящего из имени отношения и объектов, заключенных в круглые скобки, например: мать(мария, анна). отец(иван, анна). Точка, стоящая после предиката, указывает на то, что рассматриваемое выражение является фактом.
Вторым типом предложений Пролога является вопрос или цель. Цель – это средство формулировки задачи, которую должна решать программа. Простой вопрос (цель) синтаксически является разновидностью факта, например: Цель: мать (мария, юлия). В данном случае программе задан вопрос, является ли мария матерью юлии.
Если необходимо задать вопрос, кто является матерью юлии, то цель будет иметь следующий вид: Цель: мать(X, юлия). Сложные цели представляют собой конъюнкцию простых целей и имеют следующий вид: Цель: Q1, Q2,…,Qn, где запятая обозначает операцию конъюнкции, а Q1, Q2,…,Qn – подцели главной цели. Конъюнкция в Прологе истинна только при истинности всех компонент, однако, в отличие от логики, в Прологе учитывается порядок оценки истинности компонент (слева направо).
Пример 15. Пусть задана семейная БД при помощи перечисления родительских отношений в виде списка фактов: мать(мария, анна). мать(мария, юлия). мать(анна, петр). отец(иван, анна). отец(иван, юлия). Тогда вопрос, является ли иван дедом петра, можно задать в виде следующей цели: Цель: отец(иван, X), мать(X, петр).
На самом деле БД Пролога включает не только факты, но и правила. Факты и правила представляют собой не множество, а список. Для получения ответа БД просматривается по порядку, то есть в порядке следования фактов и предикатов в тексте программы.
Цель достигнута, если в БД удалось найти факт или правило, который (которое) удовлетворяет предикату цели, то есть превращает его в истинное высказывание. В нашем примере первую подцель удовлетворяют факты отец(иван, анна). и отец(иван, юлия). Вторую подцель удовлетворяет факт мать(анна, петр). Следовательно, главная цель удовлетворена, переменная X связывается с константой анна. Третьим типом предложения является правило.
Правило позволяет вывести один факт из других фактов. Иными словами, правило – это заключение, для которого известно, что оно истинно, если одно или несколько других найденных заключений или фактов являются истинными. Правила – это предложения вида H: — P1, P2,…, Pn. Символ «: -» читается как «если», предикат H называется заключением, а последовательность предикатов P1, P2,…, Pn называется посылками. Приведенное правило является аналогом хорновского дизъюнкта H ∨ P1 ∨ P2,…, ∨ Pn.
Заключение истинно, если истинны все посылки. В посылках переменные связаны квантором существования, а в заключении — квантором всеобщности. Пример 16. Добавим в БД примера 15 правила, задающие отношение «дед»: мать(мария, анна). мать(мария, юлия). мать(анна, петр). отец(иван, анна). отец(иван, юлия). дед (X, Y): — отец(X, Z), мать(Z, Y). дед (X, Y): — отец(X, Z), отец(Z, Y).
Тогда вопрос, является ли иван дедом петра, можно задать в виде следующей цели: Цель: дед(иван, петр). Правила — самые общие предложения Пролога, факт является частным случаем правила без правой части, а цель – правило без левой части. Все предложения для одного предиката связаны между собой отношением «или». Очень часто правила в Прологе являются рекурсивными. Например, для нашей семейной БД предикат «предок» определяется рекурсивно: предок(x, y): — мать(x, y). предок(x, y): — отец(x, y). предок(x, y): — мать(x, z), предок(z, y). предок(x, y): — отец (x, z), предок(z, y).
Источник: cyberpedia.su
Язык программирования Пролог
Язык программирования Пролог — это декларативный язык программирования, в котором программная логика отображается в терминологии отношений, представленной в форме правил и фактов.
Логическое программирование
Пролог является языком логического программирования. Логическое программирование, подобно функциональному программированию, кардинально отклонилось от базового направления развития программных языков. Логическое программирование построено не на очерёдности абстракций и преобразований, определяемых машинной архитектурой фон Неймана и соответствующей ей совокупности операций, а на базе абстрактной модели, никак не связанной с конкретным видом компьютерного оборудования.
Китайский с нуля для начинающих
Увлекаем Китаем, китайским языком и культурой
Логическое программирование основано на предположении, что нужно не людей приучать мыслить в терминологиях компьютерных операций, а компьютеры обязаны исполнять команды и инструкции, понятные людям. В идеале логическое программирование должно предполагать, что набор инструкций даже не задаётся, а вместо него, в формате логических аксиом, должна быть сформулирована информация о задаче, а также совокупность предположений, достаточных для её решения.
Данный набор аксиом может считаться аналогом обычных программ. Такая программа может исполняться при формировании задачи, которая формализована как логическое утверждение, требующее доказательства. Данное утверждение принято обозначать термином «целевое утверждение». Исполнение программы заключается в попытке решения задачи, то есть в попытке доказательства целевого утверждения, с использованием предположений, заданных в логической программе.
Логическим программированием является подход к информатике, в котором языком программирования высокого уровня является логика предикатов первого порядка в формате фраз Хорна. Логикой предикатов первого порядка является универсальный абстрактный язык, который предназначен для отображения знаний и для решения задач. Он может рассматриваться как общая теория отношений.
Логическое программирования в качестве основания использует подмножество логики предикатов первого порядка. Оно позволяет программистам выполнять описание ситуации при посредстве формул логики предикатов, а далее, для формирования выводов из данных формул, использовать автоматический задачный решатель. Когда применяется язык логического программирования, главное внимание следует уделять описанию структуры поставленной задачи, а не разработке указаний компьютеру, какие операции ему нужно выполнить.
«Язык программирования Пролог»
Готовые курсовые работы и рефераты
Решение учебных вопросов в 2 клика
Помощь в написании учебной работы
Язык программирования Пролог
Язык Пролог был разработан в Марселе (Франция) в начале семидесятых годов прошлого века. Наименование языка Prolog расшифровывается как Programming in logic, то есть логическое программирование.
Все языки программирования предназначены для определенного круга проблем, где их применение является наиболее эффективным. Для Пролога это проблемы и задачи, сопряжённые с проектированием систем искусственного интеллекта, таких как:
- экспертные системы,
- переводчики,
- интеллектуальные игры.
Он применяется для работы с естественным языком и имеет мощные средства, позволяющие получать информационные данные из баз данных. При этом, применяемые в Прологе способы информационного поиска, обладают принципиальными отличиями от традиционных методов.
Пролог используется и некоторых иных областях, к примеру, при разрешении проблем реализации сложных расписаний. Причём он не считается универсальным программным языком и не предназначается, к примеру, для разрешения задач, сопряжённых с графической обработкой или численными методиками.
Пролог также находит применение в разных системах, но, как правило, не как основной язык, а как язык для формирования определённого фрагмента системы. Например, он может быть использован для формирования функций, определяющих взаимодействие с базами данных.
Пролог применяется при проектировании расширенных поисковых систем, то есть систем, не просто выполняющих поиск требуемого текста, но и исполняют роль некой «отвечающей системы». То есть, программного комплекса, способного извлекать информационные знания из значительной совокупности текстовых файлов, а далее организовать диалог с пользователем, где формируются ответы на заданные по теме вопросы.
Кроме того, Пролог применяется при проектировании новых специальных языков программирования. К примеру, функциональный язык Erland реализован на базе языка Пролог. По существу, Erland может считаться модификацией Пролога для отдельных специальных задач, которые связаны с задачами в реальном времени.
Есть много программных приложений в таких сферах, как экспертные системы, составление планов, обучение в машинном формате, игровой «искусственный интеллект», которые выполнены именно на базе языка Пролог.
Синтаксис языка Пролог, как и других языков программирования, несколько модифицируется с течением времени и выпуском новых версий. Есть множество версий языка Пролог, в том числе со свободным распространением, а также коммерческих. Целью создания языка Пролог являлось предоставление возможностей назначения спецификаций решения и разрешения компьютеру сформировать из них очерёдность исполнения для данного решения, а не назначение алгоритма решения задачи, как в других языках программирования.
Язык Пролог является интерпретатором, приглашающим пользователя задавать ему информацию. Пользователь формирует запрос или наименование функции, а выводится значение данного запроса, то есть, если «истина», то yes, а если «ложь», то no. Кроме того, выводятся допустимые значения переменных, имеющихся в запросе, задание которых может сделать запрос истинным. Это унификация запроса.
Когда задаётся символ «;», тогда выполняется отображение следующего набора значений переменных, которые унифицируют запрос, и так продолжается до момента исчерпания всей совокупности допустимых подстановок. Далее программа Пролог выводит сообщение no и ожидает очередной запрос.
Источник: spravochnick.ru
Что я знаю о языке Пролог
Это самый необычный язык, с которым мне когда-либо приходилось сталкиваться. Существует мнение, что тексты программ на Прологе ближе к человеческому мышлению, нежели тексты программ на императивных языках (C, Pascal и др.). Не верьте этому. Пролог является скорее головоломкой, чем языком программирования, а процесс создания программ очень похож на разгадывание кубика-рубика.
Пролог — язык для фанатов рекурсии и головоломок. В нём нет циклов, но это не спасает от зацикливания (пример с лабиринтом ниже). В основе императивных языков лежит алгоритм, который можно описать блок-схемой или псевдокодом. В Прологе алгоритм не нужен, но это только на первый взгляд.
Вам надо написать такой набор логических рассуждений (как правило рекурсивных), который при обработке интерпретатором превращается в алгоритм. Это одновременно баг и фича языка.
Говорят, что писать программы на Прологе намного сложнее, чем читать их. Так оно и есть, я проверил. Знакомство с этим языком я советую начать со статьи на хабре. Нет, правда, отличная статья!
Зачем это нужно?
Это эзотерический язык, не более. Поиск на гитхабе не выдаёт каких-либо значимых проектов. Пролог может быть интересен программистам, которые любят головоломки. Но я бы советовал не спешить, ведь есть более заманчивые языки: Haskel, Lisp или Ассемблер. Да и вообще не стоит забывать, что жизнь — это не только программирование 🙂
Есть узкий класс задач, для которых Пролог хорошо подходит. Например, с его помощью можно быстренько решить какую-нибудь логическую задачку (загадка Эйнштейна, поиск путей на графе, обход лабиринта и т.д.). Всё остальное проще запрогать на not(prolog) . Потому что глупо представлять строчку текста в виде бинарного дерева.
У меня Пролог был в ВУЗе на курсе искусственного интеллекта. Студентам, которых заставляют изучать этот язык, я сочувствую. Писать программы сложно. Классика жанра — конкатенация двух списков, всего две строчки кода. Я не смог самостоятельно реализовать это за три часа.
С другой стороны, когда долго над чем-то сидишь и наконец-то оно заработало… хочется улыбаться.
Пролог привлекает прежде всего своей необычностью. Думай рекурсивно, забудь про циклы!
Нам понадобится…
Насколько мне известно, самым популярным интерпретатором является SWI-Prolog. Еще встречаются GNU Prolog и Visual Prolog. Для установки под Windows идем на сайт проекта. Под линуксом достаточно установить пакет swi-prolog .
Писать программы можно в любом редакторе. Подсветка синтаксиса есть в Kate, Gedit, Medit, Sublime Text через плагин, наверняка Vim и Emacs. Редакторы ошибочно могут определять язык как Perl из-за расширения .pl .
Забавный пример
Я хочу подкинуть камень в огород Пролога. То счастье, которое нам обещают маркетологи, запросто может оказаться источником геморроя. Вот пример, выглядящий безобидно:
/* описываем конфигурацию лабиринта: */ door(1, 2). %существует дверь из первой во вторую комнаты door(2, 3). %из второй в третью и т. д. door(3, 4). /* … */ door(1, 4).
door(X, Y):-door(Y, X). %если есть дверь из Y в X, то есть дверь из X в Y
Поначалу код работает так, как от него ожидается:
?- door(2, 3). true ?- door(3, 2). true
Но если спросить у интерпретатора о существовании прохода, которого на самом деле нет…
?- door(99, 100).
…то он ничего не сможет ответить, потому что войдет в ступор зациклится. Чтобы понять, почему так происходит, вводим команду trace . Она поможет отследить, что же на самом деле делает интерпретатор и почему так происходит. Очень помогает при написании программ, берите на заметку.
[trace] ?- door(99, 100). Call: (6) door(99, 100) ? creep Call: (7) door(100, 99) ? creep Call: (8) door(99, 100) ? creep Call: (9) door(100, 99) ? creep Call: (10) door(99, 100) ?
Что тут происходит? Не находя ответа в базе фактов, интерпретатор переходит к предикату door(X, Y):-door(Y, X). и пытается его удовлетворить новым проходом по базе фактов, затем снова цепляется за предикат, и т.д. Бесконечная рекурсия или зацикливание?
Правильный ответ — рекурсия, ведь в Прологе нет циклов! Я так и не смог придумать как исправить предикат, чтобы он работал правильно.
Полезные ссылки
- Книга Ивана Братко в HTML рассказывает всё об этом языке.
- Видеокурс по логическому программированию хорош тем, что много говорится о парадигме и идеях, лежащих в основе языка, да и программировании как таковом.
- Базовые предикаты — исходники простеньких задачек.
- Ещё несколько примеров.
- Форум, посвященный Прологу. Здесь можно и помощи попросить.
- Если вам понравился Пролог, то советую почитать GEB.
А ещё тут есть три разных оператора “равно”: = , =:= , is .
Все статьи
- Строгий календарь 2022
- Строгий календарь 2021
- Ушёл в отпуск
- Осваиваем мониторинг с Prometheus. Часть 3. Настройка Prometheus server
- Строгий календарь 2020
- Осваиваем мониторинг с Prometheus. Часть 2. PromQL и метки
- Осваиваем мониторинг с Prometheus. Часть 1. Знакомство и установка
- Ускоряем установку пакетов в Debian (libeatmydata)
- Строгий календарь 2019
- Оконный менеджер i3
- Строгий календарь 2018
- Мой лончер на базе Dmenu
- Как случайно не выключить сервер по ssh
- Делаем загрузочный образ из контейнера
- Использование утилиты debootstrap
- Запускаем Debian в chroot-окружении
- Строгий календарь 2017
- Запускаем Debian в контейнере systemd-nspawn
- Ручная установка минимального Debian-based Linux (Install Debian the Archlinux way)
- Trap — обработка сигналов и ошибок в Bash
- Мои впечатления от Gentoo Linux
- Жизнь с комфортом в Openbox WM
- Гистограммы в гнуплоте
- Особенности гнуплота под Windows
Источник: laurvas.ru