Пролог язык программирования

Логическое программирование на языке Prolog

Особенности языка Пролог

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

Ориентация Пролога – “нетрадиционные” применения вычислительной техники: понимание естественного языка, базы знаний, экспертные системы и другие задачи.

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

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

Правила сопоставления термов в системе Пролог

Терм – элемент Пролог-программы – либо константа, либо переменная, либо структура.

Терм записывается как последовательность литер, которые делятся на 4 категории: {A..Z},{a..z}, {0..9},{+ — * / ^ < > ~ : . ? @ # $ &}.

Наиболее важная операция над термами – сопоставление. Сопоставление – процесс проверки сопоставимости термов.

Два терма сопоставимы, если:

— они идентичны,

— переменным в обоих термах можно присвоить в качестве значений объекты таким образом, что после подстановки они станут идентичными.

Например, date(Day,июнь,1999) и date(Day1,июнь,1999) сопоставимы, поскольку переменным Day и Day1 можно присвоить одинаковые значения от 1 до 31.

Общие принципы поиска ответов на вопросы системой Пролог

Вопрос в системе Пролог представляет собой последовательность 1 или нескольких целей.

Чтобы ответить на вопрос, Пролог пытается достичь всех целей. Достичь цели – это значит продемонстрировать, что цель является истиной, при условии, что отношения в программе являются истинными. Т.е. продемонстрировать, что цель логически следует из фактов и правил, заданных в программе.

Если вопрос содержит переменные, то система Пролог должна найти конкретные объекты, при использовании которых цели достигаются.

Объекты данных

Объекты данных в Прологе могут быть простыми данными и структурами. Простые данные могут быть константами и переменными. Константы могут быть атомами, числами и строками.

Пролог-система распознает тип объекта по его синтаксической форме в тексте программы.

Атом – комбинация букв, цифр и знака подчеркивания, начинающаяся со строчной буквы. Примеры: a, «это_атом», «this_is_atom».

Переменная – комбинация букв, цифр и знака подчеркивания, начинающаяся с прописной буквы. Примеры: V, Это_переменная25.

Структурированные объекты

Cтруктурные объекты (или просто структуры) — это объекты, которые состоят из нескольких компонент. Эти компоненты, в свою очередь, могут быть структурами.

Основной характеристикой структуры является ее размерность (или арность) — число термов в списке.

Структуры в программе ведут себя как единые объекты. Для того, чтобы объединить компоненты в структуру, требуется выбрать функтор (имя отношения, образующегося между элементами структуры) .

Например, дату можно рассматривать как структуру, состоящую из трех компонент: день, месяц и год: дата( 1, май, 2000 ) .

Структура программы

Программа на Турбо Прологе состоит из следующих семи разделов:

  • директивы компилятора — дополнительные инструкции по обработке программы;
  • CONSTANTS — раздел описания констант;
  • DOMAINS — раздел описания доменов;
  • DATABASE — раздел описания предикатов внутренней базы данных;
  • PREDICATES — раздел описания предикатов;
  • CLAUSES — раздел описания предложений;
  • GOAL — раздел описания внутренней цели.

Директива trace применяется при отладке программы для трассировки.

В программе не обязательно должны быть все эти разделы. Так, например, она может состоять из одного описания цели:

X=

  • для того, чтобы проверить, получится ли при объединении двух списков третий:
  • ?-conc(, , ) No
  • для разбиения списка на подсписки:
  • Или задать его непосредственно:
  • last2(,X). /* последний элемент одноэлементного списка — этот элемент */ last2(,X):– last2(L,X). /* последний элемент списка совпадает с последним элементом хвоста */

    Предикат, позволяющий записать элементы списка в обратном порядке (первый аргумент — исходный список, второй — список, получающийся в результате записи элементов первого аргумента в обратном порядке).

    reverse(,). /* обращение пустого списка дает пустой список*/ reverse(,Z):– reverse(T,S), conc(S,,Z). /* обращаем хвост и приписываем к нему справа первый элемент исходного списка*/

    Другой способ реверса:

    rev(,L1,L2):– rev(T,,L2). /* голову первого аргумента дописываем ко второму аргументу*/ rev(,L,L). /* если исходный список закончился, то второй аргумент — передаем в третий аргумент в качестве результата*/

    Предикат, позволяющий получать элемент списка по его номеру (первый аргумент — исходный список, второй аргумент — номер элемента и третий — элемент списка, указанного в качестве первого аргумента предиката, имеющий номер, указанный в качестве второго аргумента).

    n_element(,1,X). n_element(,N,Y):– N1=N–1, n_element(L,N1,Y).

    Предикат, проверяющий является ли элемент списком.

    is_list().

    Предикат, преобразующий список в одноуровневый(первый аргумент — исходный список, второй — результат).

    simple_list(,). simple_list(,List1):- is_list(H), /*если голова списка – список,*/ simple_list(H,List1). /*то рекурсивно вызываем предикат simple_list и передаем ему ее в качестве входного параметра*/ simple_list(,):- not is_list(H), /*если голова списка – простой элемент,*/ simple_list(List,List1). /*то рекурсивно вызываем предикат simple_list и записываем ее в список — результат*/

    Предикат, удаляющий все вхождения заданного значения из списка (первый параметр соответствует удаляемому списку, второй — исходному значению, а третий — результату удаления из первого параметра всех вхождений второго параметра).

    delete_all(_,,). delete_all(X,,L1):– delete_all (X,L,L1). delete_all (X,,):– X<>Y, delete_all (X,L,L1).

    Если нужно удалить не все вхождения определенного значения в список, а только первое, то :

    delete_one(_,,).

    delete_one(X,,L):–!. delete_one(X,,):– delete_one(X,L,L1).

    Предикат, добавляющий элемент в список (первый параметр – вставляемый элемент, второй — исходный список, а третий — результат).

    add(X, L, ).

    Но если возникает необходимость добавлять только, если элемент отсутствует, то можно использовать правило:

    add(X, L, L):-member(X, L), !. add(X, L, ).

    Проверка типов термов

    Встроенные предикаты для проверки типов термов:

    atom(X) -истина, если X-атом.

    integer(X) — истина, X-целое.

    float(X) – истина, если Х – действительное число.

    compound(X) – истина, если Х – составной терм.

    atomic(X) — истина, если X-целое или атом.

    var(X) — истина, если X-не конкретизированная переменная.

    nonvar(X) — истина, если X- терм, отличный от переменной, или уже конкретизированная
    переменная.

    ground(Х)-

    истина, если Х не содержит свободных переменных.

    number(Х)

    — истина, если Х – число.

    string(Х)

    – истина, если Х – строка.

    Операции с базами данных

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

    Описание отношений присутствует либо в явном виде (факты), либо в неявном виде (правила).

    Встроенные предикаты :

    assert(d) всегда успешен и добавляет факт d к базе данных;

    retract(d) удаляет факт, сопоставимый с d;

    asserta(d) — обеспечивает запись в начало базы данных нового факта для заданного отношения;

    assertz(d) — обеспечивает запись в конец базы данных нового факта для заданного отношения.

    Объявление динамической базы данных осуществляется с помощью ключевого слова database.

    ОСП ООП к алгоритмизации СУБД Экспертные системы ЯиМП 3GL 4GL 5GL ТП

    Знаете ли Вы, что модификаторы — это операции, которые модифицируют объекты соответствующего им типа. Например, операция push для стека.

    Тарушкин В.Т. Тарушкин П.В. Тарушкина Л.Т. Юрков А.В.

    Рассматривается содержание и методика вводной лекции по дискретной математике, рассчитанной на широкую аудиторию и не предполагающей предварительных знаний по математической логике. Пусть дано простейшее высказывание: «Джон любит Мери» (1). Можно построить ещё три таких же: «Джон любит Джона » (2); «Мери любит Джона» (3); «Мери любит Мери» (4). Эти высказывания записываются в виде элементарной формулы языка математической логики (собственное определение будет дано позднее) и её интерпретации в виде:

    P 2love (x, y) : «x любит y»,

    где x и y пробегают значения Джон, Мери. Построенные конструкции позволяют ввести раздел предикатов в программе на языке Turbo — Prolog для исследования отношений Джона и Мери:

    love (symbol, symbol) (5),

    высказывания (1) — (4) запишутся в виде раздела клауз:

    love (john, john).

    love (john, mery).

    love (mery, mery).

    love (mery, john).

    Здесь предполагается, что все высказывания (1) — (4) принимают значение истина. Цель вычислений состоит в определении значений переменной Person, которая запоминает любящих Джона символических переменных и печатает их:

    love (Person, john),

    write (» n», Person).

    Машина выдаст в окне ответов первое найденное ею решение john. Если строку (5) переписать в виде

    love (symbol, symbol) — nondeterm (o, i)

    и прейти к транслятору и языку Visual Prolog, то получим два решения. Однако Turbo- Prolog гораздо легче осваивается начинающими, чем Visual. Если первый пример решается преподавателем с использованием стационарной или портативной ЭВМ, то при решении следующего примера нужно максимально использовать инициативу обучающихся. Нужно построить программу, как и в предыдущем случае из трёх разделов (предикатов, клауз и цели), которая из простейших высказываний: «Эрику нравится плавание «, «Эрику нравится чтение», «Джону нравятся компьютеры», …, и т.д. (высказывания на английском языке и без больших букв), которая находит значение переменной Person такое, что ей будут нравиться чтение и плавание (очевидно, этим значением будет eric) Предикатом в этой программе будет

    likes (symbol, symbol)

    т.е.

    представляет собой высказывание P (x, y): » x нравится y», где x и y — переменные первого и второго сорта (первый сорт — это имена людей, а второй сорт — это нравящиеся им хобби). Таким образом имеем двусортный язык логики предикатов , а P(x, y) — атомная (элементарная) формула этого языка. Применительно к языку Пролог, рассматриваемому на начальной стадии обучения, под предикатом проще всего понимать высказывание, зависящее от переменных, а в качестве имени предиката брать глагол. После проработки второго примера для слушателей знакомых с математическим анализом следует раздать индивидуальные задания по моделированию на языке Пролог примеров на дифференцирование и интегрирование . Если слушатели с математическим анализом не знакомы, то можно продолжить изучение отношений, аналогичных изучавшихся в первых двух примерах в соответствии с .

    СПИСОК ЛИТЕРАТУРЫ

    1. Мендельсон Э. Введение в математическую логику. М: «Наука», с. 319, 1984.
    2. Колмогоров А.Н., Драгалин А.Г. Введение в математическую логику. М.: «Наука», c.118, 1982.
    3. Тарушкин В.Т., Тарушкин П.В., Тарушкина Л.Т. Экспериментальные обучающие системы для аналитического дифференцирования и интегрирования. Современные проблемы науки и образования, N 4, стр. 116 — 117, M.: «Акад. Естеств.», 2009.
    4. Адаменко А., Кучуков А. Логическое программирование и Visual Prolog. СПб.: «БХВ-Петербург», 990 c., 2003.

    Библиографическая ссылка

    Тарушкин В.Т., Тарушкин П.В., Тарушкина Л.Т., Юрков А.В. ЛОГИКА ПРЕДИКАТОВ И ЯЗЫК ПРОЛОГ // Современные наукоемкие технологии. – 2010. – № 4. – С. 62-63;

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

    Закрыть меню