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

      Комментарии к записи Как работать в SWI Prolog отключены

Помечено: , ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 6 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #3267

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

    Установка SWI Prolog

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

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

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

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

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

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

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

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

    student('Ivanov', 4.5).
    student('Fedorov', 3).
    student('Vetrov', 4.3).
    student('Petrov', 3.2).
    student('Popov', 4.6).
    student('Sidorov', 5).
    
    stipendiya(Name):-
      student(Name, SrBal), 
      SrBal > 4.
      
    company('Microsoft', 5).
    company('Apple', 4.9).
    company('IBM', 4.5).
    company('Samsung', 4).
    company('Maxim & Co', 3).
    
    isAbleToWork(NameStudent, NameCompany):-
      student(NameStudent, SrBalStudent),
      company(NameCompany, SrBalCompany),
      SrBalStudent >= SrBalCompany.

    swi-prolog-kate_1

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

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

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

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

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

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

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

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

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

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

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

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

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

Для ответа в этой теме необходимо авторизоваться.