Чтобы запустить компилятор gnu-prolog, наберите команду gprolog в терминале.
$ gprolog GNU Prolog 1.4.5 (64 bits) Compiled Aug 20 2018, 15:27:00 with clang By Daniel Diaz Copyright (C) 1999-2018 Daniel Diaz | ?-
Чтобы выйти из режима компилятора, наберите команду halt. в терминале.
| ?- halt. $
Функция write() выведет на экран переданные в нее значения. Ниже представлен пример вывода строки на экран.
?- write(«Hello, World!»). Hello, World! (1 ms) yes
Предикат — это логическая функция, которая возвращает логическое значение.
locate(pekin, china). % город Пекин находится в Китае
Допустим, у нас есть файл locate.pl с разширением пролог (.pl), как вызвать предикаты из этого файла (модуля)? Всё просто, чтобы загрузить модуль набираем [module_name]. в режиме компилятора.
| ?- [locate]. compiling /Users/Egnaf/Prolog/locate.pl for byte code. /Users/Egnaf/Prolog/locate.pl compiled, 19 lines read — 1469 bytes written, 4 ms (1 ms) yes
Теперь можем вызывать предикаты прямо из этого модуля.
Практическое занятие «Настройка, программирование и эксплуатация СПТ944»
Источник: gist.github.com
1.Знакомство с swi/prolog. Запуск простой программы
В папке с установленным SWI/PROLOG войдите в директорию pl/bin, содержащую файл plwin.exe, и запустите его. На экране появится главное меню и главное (диалоговое) окно с приглашением SWI/PROLOG (см рис.1).
Рис.1 Вид диалогового окна SWI/PROLOG
Главное меню можно сделать активным, нажав F10 или Alt. Когда главное меню активно, его элементы можно выбрать с помощью клавиш управления курсором ( ) и последующим нажатием клавиши Enter. Выбирать элементы главного меню можно также и мышью.
1.2.Первая программа
Программа
на Прологе состоит из фактов и правил, которые образуют базу знаний Пролог-программы, и запроса к этой базе, который задает цель поиска решений.
Предикат
описывают отношение между объектами, которые являются аргументами предиката.
Констатируют наличие заданного предикатом отношения между указанными объектами.
Констатация факта в предложениии
Эллен любит теннис.
в синтаксисе Пролога выглядит так:
Имя предиката (функтора) и объекта должно начинаться с маленькой буквы и может содержать латинские буквы, кириллицу, цифры и символ подчеркивания (_). Кириллица используется наравне с латинскими буквами. Обычно предикатам дают такие имена, чтобы они отражали смысл отношения. Например: main, add_file_name.
Два предиката могут иметь одинаковые имена, тогда система распознает их как разные предикаты, если они имеют различное число аргументов (арность). Например, любит/2, любит/3.
Имя предиката может совпадать с именем какого-либо встроенного предиката SWI/PROLOG-а. Однако, если совпали имена пользовательского и встроенного предиката, то при обращении к нему (либо из интерпретатора, либо из программы), будет вызван пользовательский предикат, т.е. пользовательское определение «перекроет» предопределенное в SWI/PROLOG-е.
Работа с программой ПРОЛОГ
Правила
описывают связи между предикатами.
Билл любит все, что любит Том.
в синтаксисе Пролога
Правило B:-A соответствует импликации A→B («ЕСЛИ A , ТО B»).
В общем виде правило — это конструкция вида:
которая читается «P0 истинно, если P1 и P2 и . Pn истинны».
Предикат P0 называется заголовком правила, выражение P1,P2,…,Pn — телом правила, а предикаты Pi — подцелями правила. Запятая означает логическое «И».
Факты и правила называются также утверждениями или клозами. Факт можно рассматривать как правило, имеющее заголовок и пустое тело.
Процедура
— это совокупность утверждений, заголовки которых имеют одинаковый функтор и одну и ту же арность. Процедура задает определение предиката.
Конец предложения всегда отмечается точкой, поэтому все факты, правила и запросы должны заканчиваться точкой. Заметим также, что между именем предиката и скобкой не должно быть пробелов.
Переменная
— поименованная область памяти, где может храниться значение.
Если переменная не связана со значением – она называется свободной переменной.
Унификация
— процесс получения свободной переменной значения в результате сопоставления при логическом выводе в SWI/PROLOG-е.
Понятие переменной в логическом программировании отличается от базового понятия переменной, которое вводится в структурном программировании. Прежде всего, это отличие заключается в том, что переменная в SWI/PROLOG-е, однажды получив свое значение при унификации в процессе работы программы, не может его изменить, т.е. она скорее является аналогом математического понятия «переменная» – неизвестная величина. Переменная в SWI/PROLOG не имеет предопределенного типа данных и может быть связана с значением любого типа данных.
Переменная в SWI/PROLOG обозначается как последовательность латинских букв, кириллицы и цифр, начинающаяся с заглавной буквы или символа подчеркивания ( _ ). Заметим, что если значение аргумента предиката или его имя начинается с заглавной буквы, то оно пишется в апострофах (см. предыдущий пример).
В SWI/PROLOG различаются строчные и заглавные буквы.
Рассмотрим следующую программу на SWI/PROLOG, которую будем использовать для иллюстрации процессов создания, выполнения и редактирования Пролог-программ.
ПРОГРАММА 1. /* кто что любит */
любит(‘Эллен’,теннис). %Эллен любит теннис
любит(‘Джон’,футбол). %Джон любит футбол
любит(‘Том’,бейсбол). %Том любит бейсбол
любит(‘Эрик’,плавание). %Эрик любит плавание
любит(‘Марк’,теннис). %Марк любит теннис
любит(‘Билл’,X):-любит(‘Том’,X). %Билл любит то, что любит Том
Комментарий в строке программы начинается с символа % и заканчивается концом строки. Блок комментариев выделяется специальными скобками: /* (начало) и */ (конец).
Источник: studfile.net
Трассировка программы
Трассировка предполагает пошаговую выдачу информации о выполнении предикатов и значениях передаваемых переменных. Для включения трассировки вначале программы записывается директива компилятора trace или shorttrace . Включение директивы trace приостанавливает выполнение программы после каждой попытки удовлетворить подцель. В этот момент в окне трассировки выводится значение переменных и другая информация, назначение которой определяется следующими словами.
CALL – каждый раз при выводе предиката в окне трассировки отображается имя предиката и входные значения его параметров.
RETURN – предложение завершено успешно и управление передается вызывающему предикату (обратный ход). Если имеются другие предложения из раздела clauses , удовлетворяющие входным параметрам, то выводится *, обозначающая , что это предложение является точкой возврата.
FAIL – выводится, если предикат несогласовывется, за этим словом выводится имя невыполнимого предиката.
REDO – имеется возврат к предудущему состоянию (переход без изменения параметров к другому предложению для данного предикаат. Имя предиката, который повторно выполняется, вместе со значением его параметров отображается в окне трассировки.
Для продолжения выполнения программы необходимо нажать F 10. Прервать выполнение программы можно клавишей ESC . Комбинация Ctrl — T во время пошагового выполнения программы позволяет включать и выключать трассировку по желанию. Если требуется производить трассировку только нескольких предикатов, то перечень этих предикатов разделяется запятыми и записывается после слова trace .
Директива shorttrace является аналогм trace , с той разницей, что в окно трассировки выводится более краткая информация. В некоторых случаях возникает необходимость получить трассировку лишь отдельного фрагмента программы. Для этйо цели в начале и конце этого фрагмента записывается стандартный предикат trace c соответствующим параметром статуса on или off . Формат стандартного предиката trace (Статус) ( symbol ) : ( i ) ( o ).
Директива компидятора diagnostics
Если эта директива имеется в начале программы, то выдается диагностическая таблица, в которй содержится список предикатов и их важнейшие свойства.
Type – указывает, является ли предикат локальным, глобальным или внешне определенным.
Determ – помещается информация, является ли предикат однозначным.
Size – даетс яразмер кода предиката, кроме того выводится поточный шаблон предиката и типы его параметров .
Диагностическая таблица будет выдана только при наличии в программе раздела goal .
Источник: prolog.ucoz.com