Swi prolog как запустить программу
Перейти к содержимому

Swi prolog как запустить программу

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

Знакомство с интерпретатором SWI/PROLOG, включая использование меню, создание программных файлов, запуск и трассировку программ наSWI/PROLOG.

Главное меню

В папке с установленным SWI/PROLOGвойдите в директориюpl/bin, содержащую файлplwin.exe, и запустите его. На экране появится главное меню и главное (диалоговое) окно с приглашениемSWI/PROLOG (см рис.1).

Рис.1Вид диалогового окнаSWI/PROLOG

Главное меню можно сделать активным, нажав F10 илиAlt. Когда главное меню активно, его элементы можно выбрать с помощью клавиш управления курсором () и последующим нажатием клавишиEnter. Выбирать элементы главного меню можно также и мышью.

Первая программа

Программа

на Прологе состоит из фактовиправил, которые образуютбазу знанийПролог-программы, изапросак этой базе, который задаетцельпоиска решений.

Предикат

описывают отношение между объектами, которые являются аргументами предиката.

Констатируют наличие заданного предикатом отношения между указанными объектами.

Констатация факта в предложениии

Эллен любит теннис.

в синтаксисе Пролога выглядит так:

Имя предиката(функтора) и объекта должноначинаться с маленькойбуквы и может содержать латинские буквы, кириллицу, цифры и символ подчеркивания (_). Кириллица используется наравне с латинскими буквами. Обычно предикатам дают такие имена, чтобы они отражали смысл отношения. Например:main, add_file_name. Два предиката могут иметь одинаковые имена, тогда система распознает их как разные предикаты, если они имеют различное число аргументов (арность). Например, любит/2, любит/3.

Имя предиката может совпадать с именем какого-либо встроенного предиката SWI/PROLOG-а. Однако, если совпали имена пользовательского и встроенного предиката, то при обращении к нему (либо из интерпретатора, либо из программы), будет вызван пользовательский предикат, т.е. пользовательское определение «перекроет» предопределенное вSWI/PROLOG-е.

Правила

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

Билл любит все, что любит Том.

в синтаксисе Пролога

Правило B:-Aсоответствует импликацииABЕСЛИ A , ТО B»).

В общем виде правило— это конструкция вида:

Предикат P0называетсязаголовком правила, выражениеP1,P2,…,Pnтелом правила, а предикатыPiподцелями правила.Запятаяозначает логическое «И«.

Факты и правила называются также утверждениямииликлозами. Факт можно рассматривать как правило, имеющее заголовок и пустое тело.

Процедура

— это совокупность утверждений, заголовки которых имеют одинаковый функтор и одну и ту же арность. Процедура задает определение предиката.

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

Переменная

— поименованная область памяти, где может храниться значение.

Если переменная не связана со значением – она называется свободной переменной.

Унификация

— процесс получения свободной переменной значения в результате сопоставления при логическом выводе в SWI/PROLOG-е.

Понятие переменной в логическом программировании отличается от базового понятия переменной, которое вводится в структурном программировании. Прежде всего, это отличие заключается в том, что переменная в SWI/PROLOG-е, однажды получив свое значение при унификации в процессе работы программы, не может его изменить, т.е. она скорее является аналогом математического понятия «переменная» – неизвестная величина. Переменная вSWI/PROLOGне имеет предопределенного типа данных и может быть связана с значением любого типа данных.

Переменная в SWI/PROLOGобозначается как последовательность латинских букв, кириллицы и цифр, начинающаяся с заглавной буквы или символа подчеркивания ( _ ). Заметим, что если значение аргумента предиката или его имя начинается с заглавной буквы, то оно пишется в апострофах (см. предыдущий пример).

В SWI/PROLOGразличаются строчные и заглавные буквы.

Рассмотрим следующую программу на SWI/PROLOG, которую будем использовать для иллюстрации процессов создания, выполнения и редактирования Пролог-программ.

ПРОГРАММА 1. /* кто что любит */

любит(‘Эллен’,теннис). %Эллен любит теннис

любит(‘Джон’,футбол). %Джон любит футбол

любит(‘Том’,бейсбол). %Том любит бейсбол

любит(‘Эрик’,плавание). %Эрик любит плавание

любит(‘Марк’,теннис). %Марк любит теннис

любит(‘Билл’,X):-любит(‘Том’,X). %Билл любит то, что любит Том

Комментарий в строке программы начинается с символа % и заканчивается концом строки. Блок комментариев выделяется специальными скобками: /* (начало) и */ (конец).

Для того чтобы набрать текст программы воспользуйтесь встроенным текстовым редактором. Чтобы создать новый файл выберете команду File/New, в диалоговом окне укажите имя нового файла, например,тест. Для редактирования уже созданного файла с использованием встроенного редактора можно воспользоваться командой меню File/Edit. Набейте программу 1 (текст программы выше по тексту) и сохраните ее (File/Save buffer).

Внешний вид редактора

Красным цветом подсвечиваются предикаты в заголовках предложений, которые с точки зрения синтаксиса SWI/PROLOGа корректны. Указатель “курсор” можно использовать для выверки (например, корректности) расстановки скобок. Зелёным цветом выделяются комментарии ,темно-красным цветом — переменные. Подчеркиванием выделяются предикаты в теле правила, которые совпадают с предикатом заголовка,- таким образом акцентируется внимание на возможном зацикливании программы.

Чтобы запустить программу, сначала необходимо ее загрузить в SWI/PROLOGдля выполнения. Это делается выбором опцииCompile/Compile bufferиз окна редактора. Результат компиляции отображается в окне интерпретатораSWI/PROLOGа. Там же указываются ошибки, возникшие при компиляции, чаще всего они отображаются и во всплывающем окне ошибок. Обычно перед компиляцией предлагается сохранить файл.

Другой способ загрузить уже существующий файл – это выполнение команды Consultв подменюFileдиалогового окнаSWI/PROLOG. На экране появится диалоговое окно.

Укажите имя файла, который вы хотите загрузить, и выберите Открыть. Если вы попытаетесь загрузить для выполнения файл, в котором есть синтаксические ошибки, то он не загрузится, а вы получите сообщение об ошибке в главном окне. Угловые скобки<< >>будут выделять место, где встретилась ошибка. По умолчанию файлы, ассоциируемые сSWI/PROLOGимеют расширение.pl.

Файлы также можно загрузить, используя встроенный предикат:

consult(Имя файла или имена нескольких файлов).

consult(Test). % test – имя файла

consult([Test1,Test2]). % Загрузка двух файлов.

Для выполнения загрузки этот предикат нужно написать в главном окне после приглашения интерпретатора (?-), которое означает, что интерпретатор ждет запрос.

Запрос

— это конструкция вида:

которая читается «Верно ли P1иP2и . Pn?». ПредикатыPiназываютсяподцелями запроса.

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

Для просмотра предложений загруженной базы знаний можно использовать встроенный предикат listing.

Проверьте загрузку исходного файла, задайте запрос

?-любит(‘Билл’,бейсбол). % Любит ли Билл бейсбол?

Получите ответ yes (да) и новое приглашение к запросу.

Введите следующие запросы и посмотрите на результаты.

?-любит(‘Билл’,теннис).%Любит ли Билл теннис?

?-любит(Кто, теннис). %Кто любит теннис?

?-любит(‘Марк’,Что),любит(‘Эллен’,Что).%Что любят Марк и Эллен?

?-любит(Кто, Что). %Кто что любит?

?-любит(Кто, _). %Кто любит?

При поиске решений в базе Пролога выдается первое решение.

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

Если необходимо прервать выполнение запроса, (например, нужно набрать другой запрос), используйте клавишу b.

Если Вы хотите повторить один из предыдущих запросов, воспользуйтесь клавишами «стрелка вверх» или «стрелка вниз».

Перезагрузить, измененные во внешнем редакторе, файлы можно, используя встроенный предикат make. Например так:

Как работать в SWI Prolog

Если у вас возникают проблемы с пониманием того, как вообще выполняются программ на Prolog — посмотрите статью: Введение в логическое программирование.

В этой статье описан процесс установки SWI Prolog и запуска простой программы в консоли (терминале) с помощью утилицы swipl. Однако, для SWI Prolog есть несколько сред разработки.

Установка SWI Prolog

swi-prolog-installation

Я буду устанавливать SWI Prolog на 64х разрядную версию OpenSUSE 42.1. Для установки открываем центр управления Yast:

swi-prolog-installation_1

Выбираем «Управление программным обеспечением». В появившемся окне вводим swipl, в правой части окна появляется соответствующий пакет, нажимаем на него правой кнопкой мыши и выбираем «установить»:

swi-prolog-shell

Теперь для работы в среде SWI Prolog можно открыть терминал и ввести команду swipl. Будет запущен интерпретатор, в который можно передавать команды:

Программирование в SWI Prolog

swi-prolog-kate

Для присоединения файлов с исходным кодом можно выполнить команду consult(путь к файлу) или [путь к файлу] . Немного удобнее использовать редактор кода (например kate или gedit) со встроенным окном терминала (для этого во многих редакторах есть специальные плагины):

Для работы нужно открыть в редакторе файл исходного кода, в терминале перейти в соответствующий каталог и выполнить в нем команду swipl , присоединить файл исходного кода при помощи consult . Теперь можно передавать интерпретатору команды. В приведенном выше примере, в файле описаны студенты в соответствии с заданием, мы выполняем команду student(Who, Rate) для получения информации обо всех студентах в базе.

В отличии от Visual Prolog, SWI Prolog не выводит сразу все найденные решения. Выводится первое решение, при этом если полученных данных пользователю достаточно, он может ввести точку, а если ему нужны другие решения — то нужно ввести точку с запятой.

Введем в текстовом редакторе программу в соответствии с заданием:

swi-prolog-kate_1

Для обновления данных в интерпретаторе нужно повторно выполнить команду consult.

Разберем предложенную программу:

  1. предикаты company и student являются фактами (подобно предикату parent из предыдущей работы);
  2. предикат stipendya принимает имя студента, выполняет поиск студента в базе и получение его среднего балла. Затем выполняется сравнение среднего балла с константой:
    1. если сравнение проходит успешно, то предикат также завершится успешно и «снаружи» мы получим имя студента, для которого есть стипендия;
    2. если при сравнении выясняется, что балл студента меньше константы, то предикат завершается неудачей. Никакого результата (информации о студенте, с которым это случилось) «снаружи» мы при этом не получим, но будет запущен механизм поиска с возвратами (интерпретатор попробует подобрать других студентов, соответствующих нашим критериям);
    3. предикат может завершиться неудачей до выполнения сравнения — если передано имя студента, о котором нет информации в базе (мы просто не сможем получить для него средний балл);
    4. наконец, если в предикат передана анонимная переменная stipendya(Name) , то будут выведены все студенты, для которых начисляется стипендия.

    swi-prolog-debug

    Чтобы составить запрос относительно получения стипендии студентом Поповым достаточно передать имя студента в качестве аргумента правилу stipendya . При выполнении такого запроса мной были получены ошибки:
    .

    Интерпретатор сообщает, что нет такого предиката в нашей программе. На самом деле, в программе содержится опечатка (имя функции написано неверно). После исправления ошибки и перекомпиляции программы командой [имя файла] или consult(имя файла) ошибка исправлена, получен ответ true , означающий, что студенту Попову положено получать стипендию.

    swi-prolog-goal_1

    Аналогично выполняется проверка получения стипендии студентом Федоровым (которому стипендия не положена, поэтому выводится false ):

    Чтобы получить имена всех студентов, получающих стипендию передадим в качестве аргумента функции stipendiya анонимную переменную:
    swi-prolog-goal_2

    swi-prolog-goal_3

    Чтобы получить минимальный средний балл, необходимый для трудоустройства в Microsoft нужно выполнить запрос company('Microsoft', X) . Во время его выполнения нужная информация будет получена непосредственно из факта company('Microsoft', 5) . Результат:

    swi-prolog-goal_4

    Чтобы проверить может ли Попов трудоустроиться в Microsoft нужно использовать предикат isAbleToWork :

    swi-prolog-goal_5

    Чтобы узнать организации, в которые может устроиться на работу Федоров, нужно передать имя студента в isAbleToWork , но в качестве названия компании передать анонимную переменную:

    swi-prolog-goal_6

    Чтобы получить имена студентов, способных устроиться в Apple, нужно наоборот передать в isAbleToWork имя компании, а вместо имени студента указать переменную без присвоенного заранее значения:

    swi-prolog-goal_7

    Аналогичный запрос, но с именем компании IBM нужно выполнить для поиска студентов, которые могут трудоустроиться в эту компанию. Результаты отличаются тем, что устроиться может несколько студентов. Для получения всех студентов нужно вводить точку с запятой после каждого результата:

    Выводы: во время выполнения работы были получены навыки работы в среде SWI-Prolog Исследован код программы, выданный преподавателем; во время выполнения заданий получены некоторые навыки отладки программ в интерпретаторе SWI-Prolog.

    Swi prolog как запустить программу

    By default, SWI-Prolog is installed as‘swipl’. The command line arguments of SWI-Prolog itself and its utility programs are documented using standard Unix man pages. SWI-Prolog is normally operated as an interactive application simply by starting the program:

    After starting Prolog, one normally loads a program into it using consult/1, which may be abbreviated by putting the name of the program file between square brackets. The following goal loads the file likes.pl containing clauses for the predicates likes/2 :

    Alternatively, the source file may be given as command line arguments:

    Both the above assume likes.pl is in your working directory. If you use the command line version swipl the working directory is the same as the shell from which you started SWI-Prolog. If you started the GUI version (swipl-win) this depends largely on the OS. You can use pwd/0 and cd/0 to find and change the working directory. The utility ls/0 lists the contents of the working directory.

    The file likes.pl is also installed in a subdirectory demo insides SWI-Prolog’s installation directory and may be loaded regardless of the working directory using the command below. See absolute_file_name/3 and file_search_path/2 for details on how SWI-Prolog specifies file locations.

    After this point, Unix and Windows users unite, so if you are using Unix please continue at section 2.1.2.

    2.1.1.2 Starting SWI-Prolog on Windows

    After SWI-Prolog has been installed on a Windows system, the following important new things are available to the user:

    • A folder (called directory in the remainder of this document) called swipl containing the executables, libraries, etc., of the system. No files are installed outside this directory.
    • A program swipl-win.exe, providing a window for interaction with Prolog. The program swipl.exe is a version of SWI-Prolog that runs in a console window.
    • The file extension .pl is associated with the program swipl-win.exe. Opening a .pl file will cause swipl-win.exe to start, change directory to the directory in which the file to open resides, and load this file.

    The normal way to start the likes.pl file mentioned in section 2.1.1.1 is by simply double-clicking this file in the Windows explorer.

    2.1.2 Adding rules from the console

    Although we strongly advice to put your program in a file, optionally edit it and use make/0 to reload it (see section 2.1.4), it is possible to manage facts and rules from the terminal. The most convenient way to add a few clauses is by consulting the pseudo file user . The input is ended using the system end-of-file character.

    The predicates assertz/1 and retract/1 are alternatives to add and remove rules and facts.

    2.1.3 Executing a query

    After loading a program, one can ask Prolog queries about the program. The query below asks Prolog what food‘sam’ likes. The system responds with X = < value > if it can prove the goal for a certain X . The user can type the semi-colon (;) or spacebar 7 On most installations, single-character commands are executed without waiting for the RETURN key. if (s)he wants another solution. Use the return key if you do not want to see more answers. Prolog completes the output with a full stop (.) if the user uses the return key or Prolog knows there are no more answers. If Prolog cannot find (more) answers, it writes false. Finally, Prolog answers using an error message to indicate the query or program contains an error.

    Note that the answer written by Prolog is a valid Prolog program that, when executed, produces the same set of answers as the original program. 8 The SWI-Prolog top level differs in several ways from traditional Prolog top level. The current top level was designed in cooperation with Ulrich Neumerkel.

    2.1.4 Examining and modifying your program

    If properly configured, the predicate edit/1 starts the built-in or user configured editor on the argument. The argument can be anything that can be linked to a location: a file name, predicate name, module name, etc. If the argument resolves to only one location the editor is started on this location, otherwise the user is presented a choice.

    If a graphical user interface is available, the editor normally creates a new window and the system prompts for the next command. The user may edit the source file, save it and run make/0 to update any modified source file. If the editor cannot be opened in a window, it opens in the same console and leaving the editor runs make/0 to reload any source files that have been modified.

    The program can also be decompiled using listing/1 as below. The argument of listing/1 is just a predicate name, a predicate indicator of the form Name/Arity , e.g., ?- listing( mild/1 ). or a head, e.g., ?- listing(likes(sam, _)). , listing all matching clauses. The predicate listing/0, i.e., without arguments lists the entire program. 9 This lists several hook predicates that are defined by default and is typically not very informative.

    2.1.5 Stopping Prolog

    The interactive toplevel can be stopped in two ways: enter the system end-of-file character (typically Control-D) or by executing the halt/0 predicate:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *