Программирование на языке Prolog. 8371_Васиков_Курышев_Лаб1. Логическое программирование на языке Prolog
![]()
|
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра АПУ ОТЧЕТ по практической работе №1 по дисциплине «Интеллектуальные информационные системы» Тема: «Логическое программирование на языке Prolog» Вариант 7
Санкт-Петербург 2021 Задание на практическую работу Задан фрагмент генеалогического дерева, изображенный на рисунке ниже. Необходимо разработать программу на языке Prolog, которая позволит ответить (на основании информации по генеалогическому дереву) на вопросы, указанные в таблице (в соответствии с номером варианта). При этом необходимо реализовать предикаты для отношений, перечисленных в первом столбце таблицы. Требования: среда SWI-prolog ![]() ![]() Общие теоретические сведения Prolog (PROgramming in LOGic) – декларативный язык программирования: решение задачи получается логическим выводом из ранее известных положений. Программа на Прологе представляет собой набор фактов с правилами, обеспечивающими получение заключений на основе этих фактов. Основа Пролога – Логика предикатов. Пролог пытается проверить истинность гипотезы, запрашивая для этого информацию, о которой уже известно, что она истинна. В Прологе необходимо описать объекты и отношения, а затем правила, для которых эти отношения являются истинными. Например, предложение «Джону нравятся коты» – устанавливает отношение между между «джон» и «коты», отношение «нравятся». Пример правила: «Джону нравятся коты, если они пушистые». Особенность Пролога заключается в том, что мы описывает, что мы хотим получить, а не как мы это хотим получить. Пролог решает задачу путём логического вывода из известных ему фактов и правил. Механизм логического вывода Пролога берёт условия из правил и просматривает список известных фактов и правил, пытаясь удовлетворить условиям. Объекты данных в Прологе называются термами. Пролог использует методы полного перебора и обход дерева. Во время проверки условий (доказательства утверждений) Пролог заменяет переменные на конкретные значения. Принцип работы с прологом: Создать базу знаний Пролога (обычно имеет расширение .pl). Здесь хранятся факты и правила. Можно использовать любой текстовый редактор (в VS code есть расширения для работы Prolog) , либо использовать встроенный реадактор SWI-prolog Затем задаем вопросы: Через консоль запускаем swipl file.pl Либо через SWI prolog меню File->Consult См. https://www.swi-prolog.org/pldoc/man?section=quickstart Факты Факты – отношения между объектами. Факт завершается точкой: likes(john,mary). likes(mary,paul). likes(paul,apple). Свойства: green(grass). Правила Правило – это заключение, для которого известно, что оно истинно. Правило имеет две части: заголовок и тело. Части разделяются символом :-, который означает «если». Правило: likes(mary,X):-likes(paul,X). читается как «Мэри любит всё, что любит Пол» или «Мэри любит что-то, если это что-то любит Пол». Запросы Задавать вопрос – означает попросить Пролог доказать утверждение. Например: - study(mark, book). Запросы также называют более общим термином «цель», т.е. мы даём Прологу цель для выполнения. Переменные Переменные – с большой буквы, постоянные идентификаторы с маленькой. В правиле likes(mary,X):-likes(paul,X) X – это переменная, можно было назвать Something или Y, как угодно. В прологе нет оператора присваивания; переменные инициализируются при сопоставлении с константами в фактах и правилах. В переменной нельзя сохранить значение, Анонимные переменные Обозначаются символом подчёркивания ( _ ). Например, если наша цель узнать имена родителей (но не детей ) , то мы можно задать запрос parent(Parent,_). Предикаты Отношение в прологе – предикаты. Предикаты могут иметь разное количество аргументов: green(grass). person(peter,jackson,male). Конъюнкция и дизъюнкция Конъюнкция в Прологе (логическое И) обозначается запятой. Дизъюнкция в Прологе (логическое ИЛИ) обозначается точкой с запятой. Например, правило older(X,Y) :- older(X,Z),older(Z,Y). X старше, если X старше Z и Z старше Y Выполнение работы *В качестве правил для отношений и целей был выбран вариант №7. Объявление супругов: 1 параметр – муж, а второй – жена. Предикаты и правила matrimony(henry, ira). matrimony(adam, eve). matrimony(eriq, mimi). matrimony(eriq, laura). matrimony(jack, megan). matrimony(jack, sherry). matrimony(john, sandy). matrimony(malik, lydia). matrimony(david, carol). matrimony(david, gloria). matrimony(william, gloria). Объявление семей: 1 параметр – отец, второй – мать, третий – ребёнок. family(henry, ira, james). family(henry, ira, eriq). family(henry, ira, megan). family(adam, eve, jack). family(adam, eve, delphi). family(adam, eve, sandy). family(eriq, mimi, malik). family(eriq, laura, carol). family(jack, megan, paul). family(jack, megan, lydia). family(jack, sherry, david). family(john, sandy, william). family(malik, lydia, yulianna). family(david, carol, steven). family(david, gloria, christina). family(william, gloria, george). Объявление полов для людей без семьи. Первый параметр – имя, второй используется для откладки, чтобы отличить вычисленное значение от заданного вручную. male(james, fact). male(paul, fact). male(steven, fact). male(george, fact). male(X, rule) :- matrimony(X, _). female(delphi, fact). female(yulianna, fact). female(christina, fact). Правило для вычисления пола на основе положения в браке. Второй параметр используется для откладки. female(X, rule) :- matrimony(_, X). Правило для определения отцовства и материнства на основе положения в семье. father(X, Father):- family(Father, _, X). mother(X, Mother):- family(_, Mother, X). Правило для нахождения родителей. parent(X, Parent):- (father(X, Parent); mother(X, Parent)). Правило для нахождения дедушек. grandfather(X, Grandfather):- (parent(X, Parent), father(Parent, Grandfather)). Правило для определения бабушек. grandmother(X, Grandmother):- (parent(X, Parent), mother(Parent, Grandmother)). Правило для нахождения прадедушек. great_grandfather(X, GreatGrandfather):- (parent(X, Parent), parent(Parent, Grandparent), father(Grandparent, GreatGrandfather)). Правило для определения братьев или сестёр. sibling(X, Sibling, rule):- (family(Father, Mother, X), family(Father, Mother, Sibling), Sibling \= X). Правило поиска сестры. sister(X, Sister):- (sibling(X, Sister), female(Sister, _)). Правило определения детей. child(X, Child):- (family(X, _, Child); family(_, X, Child)). Правило определения дочери. daughter(X, Daughter):- (child(X, Daughter), female(Daughter, _)). Правило определения внучки. granddaughter(X, GrandDaughter):- (child(X, Child), daughter(Child, GrandDaughter)). Полный код можно посмотреть в прикреплённом файле lab1.pl Запросы Кто прадед Кристины? Запрос: great_grandfather(christina,GreatGrandFather). Ответ: GreatGrandFather = adam ![]() Чья бабушка Мими? Запрос: granddaughter(mimi, GrandDaughter). Ответ: GrandDaughter = yulianna ![]() Лаура сестра Пола? Запрос: sibling(paul,Sibling,rule). Ответ: Sibling = lydia. ![]() Вывод Мы успешно разработали первое приложение на логическом языке программирования Prolog в среде разработки SWI-Prolog. Выполнили задание выбранного варианта. |