Знакомство с swi prolog

ПРИЛОЖЕНИЕ 2. ВСТРОЕННЫЕ ПРЕДИКАТЫ И ОПЕРАТОРЫ

Среда разработки программ PIE и система SWI-Prolog. Знакомство с Prolog'м лучше всего начинать с интерпретатора, который. В этой статье я попытаюсь рассказать о Prolog как инструменте Вы про какой Пролог? Мне кажется SWI-Prolog и XSB очень даже. Знакомство с интерпретатором SWI/PROLOG, включая использование меню, создание программных файлов, запуск и трассировку.

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

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

Термы Термы имеют рекурсивное определение, как именованная совокупность объектов. Опять же с математической точки зрения Переменные связываются словом Для Всех, а если в утверждении необходимо слово существует то, для этой цели применяется терм функтор. Для любого числа существует число-факториал: С точки зрения программирования терм можно объяснить гораздо проще: Главное отличие, все объекты в Prolog immutable, то есть менять атрибуты в них нельзя, зато есть специальное состояние — переменная.

Пример — целочисленная арифметика нат 0. Определение свойства нат натуральное число. Да, это может помогать вычислениям, своеобразная преждевременная оптимизация, но побочными эффектами могут быть противоречия в определениях, неоднозначный вывод утверждения, зацикливание интерпретатора. Как Prolog понимает предикаты и как доказывает утверждения Конечно чтение программ, помогает ощутить стиль Пролог, но не делает понятным для чего и как данные определения могут использоваться.

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

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

Дело в том, что в Базе данных мы вполне знаем какой ответ мы хотим получить исходя из данных в таблице, к сожалению глядя на Пролог программы достаточно сложно сказать, какие утверждения логически выводимы, поэтому понять как работает Пролог интерпретатор гораздо проще. Рассмотрим на примере запроса плюс 0, 0, Результат: Находим совпадение своеобразный pattern-matching, резолюция данного запроса с левой частью одно из правил.

Для данного запроса плюс 0, Число, Число. Соотнесем поочередно все аргументы запроса с правилом и получим: Так как у данного правила нет условий, мы получили ответ на заданный вопрос.

Запрос плюс Результат, 0, число 0: Находим резолюцию с правилом плюс 0, Число, Число: Следовательно ищем резолюцию со следующим правилом. Ответ найден число 0.

1. ЗНАКОМСТВО С SWI/PROLOG. ЗАПУСК ПРОСТОЙ ПРОГРАММЫ - PDF

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

Суть Пролог машины такова, что вы можете отказаться от 1-го результата, тогда Пролог вернется к предыдущему состоянию и продолжит вычисление. Заключение К сожалению, разумный размер топика, не дал мне подобраться к главной теме, а именно к решению сложных логических задач на языке Пролог, не обладая стратегией их решения. Введите следующие запросы и посмотрите на результаты.?

При поиске решений в базе Пролога выдается первое решение. Если необходимо прервать выполнение запроса, например, нужно набрать другой запросиспользуйте клавишу b. Перезагрузить, измененные во внешнем редакторе, файлы можно, используя встроенный предикат make. Опишем некоторые из них: В том числе и pl. Удобна при редактировании файлов во внешнем редакторе. Бадминтон - это вид спорта.

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

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

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

Вначале рассматривается первая подцель она имеет два предложения в базе, заголовки которых сопоставимы с ней, поэтому она является точкой возврата. Выбирается первое сверху предложение это факт a 1при этом свободная переменная X получает значение 1. Первая цель запроса доказана. Вторая цель - b 1 X уже связана со значением 1 не сопоставляется ни с одним правилом базы, следовательно, является ложной.

Бэктрекинг возврат к ближайшей точке возврата, то есть a x. На втором дереве отображен вывод по второй альтернативе. Связываются две переменные X из запроса и Y из правила для предиката a.

Первая подцель это c y она является новой точкой ветвления, так как унифицируется с двумя предложениями в базе. Первое предложение факт приводит к унификации Y с 1, но следующая в наборе подцель d 1 ложна.

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

Для выхода из режима трассировки предикат nodebug 4. Перейдите в режим трассировки. В данном случае укажите предикат любит. Обратите внимание, что справа внизу находятся три кнопки, где указываются как контрольные точки, так и точки трассировки. Контрольные точки Spy points позволяют вызвать графический отладчик. Точки трассировки Trace points консольный отладчик.

Третий выбор просмотр и редактирование файла программы, содержащей, введенный в поле Predicate, предикат. Внешний вид изображен на снимке ниже. На момент написания методички графический отладчик не поддерживал русских предикатов не работает корректно указание контрольных точек и точек трассировки через графический интерфейс.

В связи с этим опишем предикаты относящиеся к отладке программы с использованием командной строки. Предикат trace Описание Включить режим трассировки. Если не указаны точки трассировки, будет производиться полная пошаговая трассировка. Выход из режима трассировки. Включить графического режима трассировки. Окно графического режима трассировки включается при встрече первой контрольной точки spy-point. Отключить графического режима трассировки. Установить точку трассировки предиката с именем Pred то есть отображаться при трассировке будет каждое событие связанное с предикатом Pred.

Установить точку трассировки предиката с именем Pred и активирующейся по событиям при прохождении по портам Ports. События могут быть следующих типов: Сам же параметр Ports может принимать значения типов сообщений с префиксами соответствующими добавлению и удалению события порта из точки трассировки а так же списки таких значений.

Descargar, Instalar y Correr SWI-PROLOG

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

Знакомство сswi/prolog. Запуск простой программы

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

Трассировка изображена на следующем рисунке: Внешний вид графического отладчика изображен на рисунке. Сверху, в виде кнопок, находятся допустимые действия. Вторая кнопка стрелка вправо позволяет выполнять программу пошагово предикат за предикатом. Цвет выделения также имеет значение. Красный цвет обозначает неудачу, ложность решения. Построить дерево вывода для построенной в задании 1. Живет зебра на земле. Живет собака на земле. Живет карп в воде. Живет кит в воде. Кошка живет там же, где живет собака.

Живет крокодил в воде и на земле. Живет лягушка в воде и на земле. Живет утка в воде, на земле и в воздухе. Живет орел в воздухе и на земле. Живет буревестник в воде и в воздухе. Задайте к этой базе запросы воспользуйтесь предикатом help для поиска отношения "неравно". Кто живет на земле, но не является собакой? Кто живет и на земле, и в воде? Знакомство со структурами данных и их унификацией. Любой объект задачи и любое отношение между объектами представляется термом того или иного вида.

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

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

Например, в правиле c x: Это правило можно заменить двумя: Для создания операторной формы предиката с функтором Name можно воспользоваться встроенным предикатом op precedence, Type, Nameгде Precedence приоритет вводимого оператора целое неотрицатель- 17 16 ное числоType тип вводимого оператора инфиксный, постфиксный и.

Операторная форма позволяет записывать факты, запросы и правила в операторном виде. Разъясним это на примере.? Здесь тип xfx значит, что оператор имеет не обладает ни правой, ни левой ассоциативностью в отличие от случаев xfy и yfx соответственно.

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

Верно ли, что Лена имеет синий платок? Отрицание некоторого предиката является истинным, если невыполнимым является исходный предикат, то есть не существует возможности доказательства его истины. База знаний Пролога описывает замкнутый мир объектов и отношений, поэтому отрицательный ответ на вопрос может обозначать как логическую ложь, так и ответ "не знаю". Чаще всего операция not используется в определении цели "проверка" в схеме программирования "метод генерации и проверки", который состоит в порождении множества кандидатов в решение и дальнейшей их фильтрации: Кто живет ровно в одной среде обитания?

Кто живет хотя бы в двух ровно в двух средах обитания? Иван имеет машину-вишневую "Волгу". Петр имеет руб. Какие вещи имеет Иван, которых нет у Николая? Деньги - не вещь c Добавьте к этой базе данных следующие факты: Может ли Петр купить видео?

У кого больше всего денег? Что может купить Коля? Что может купить Коля из того, что имеет Иван? Анна является женой Коли. Мария является женой Ивана. Ольга является женой Петра.

Имеет ли Мария машину? Что может купить Анна, чего не имеет Мария? Знакомство с основным методом программирования в Прологе - рекурсией. Замена рекурсии итерацией программирование с накопителями. Рекурсивным называется определение функции предиката через эту же функцию предикат. Рекурсивное правило в общем случае имеет следующий вид: В процессе рекурсии предикаты группы С запоминаются и выполняются лишь по завершении рекурсии обратный ход. Рассмотрим дерево вывода ответа на запрос:?

SWI-Prolog - реализация языка программирования Prolog - Энциклопедия языков программирования

Это пример так называемой бесконечной рекурсии "зацикливание" программы. Запустите программу, когда надоест любоваться красотами написания этой песни, нажмите на клавишу b для приостановки бесконечного вывода или e - для выхода из интерпретатора.

Подобные программы не представляют интереса, поскольку в них отсутствует условие выхода. Условием выхода из рекурсии обычно является некий 19 факт или правило, при успешном выполнении которого программа заканчивает свою работу. Рассмотрим следующий вариант программы. Рассмотрим задачу нахождения факториала некоторого целого неотрицательного числа. Рекурсивное вычисление факториала вариант 0.

Рассмотрим дерево вывода ответа на вопрос:? Обратный ход с подсчетом результата это шаги 10 и