6 янв. 2011 г.

Prolog

Prolog
Используется:
GNU Prolog
Debian GNU\Linux

В универе были заданы несколько лабораторных работ по языку Prolog, далее собственно выполнение моего задания. Создание простой базы данных, экспертной системы и семантическая сеть.



Лабораторная работа №1
1. Цель работы

Исследование простейших средств вывода систем логического программирования. Изучение средств представления фактов и запросов на языке Пролог.


2. Варианты заданий

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

Код файла:
предприятие(севмаш).
предприятие(муссон).
предприятие(зкм).
предприятие(электромаш).
предприятие(кзэсо).

персонал(севмаш, 35).
персонал(муссон, 50).
персонал(зкм, 100).
персонал(электромаш, 100).
персонал(кзэсо,150).

отдел(севмаш, сборка, 10).
отдел(севмаш, ковка, 15).
отдел(севмаш, упаковка, 15).
отдел(муссон, торговля, 35).
отдел(муссон, фасовка, 15).
отдел(зкм, сборка_двигателей, 30).
отдел(зкм, программирование_станков_с_чпу, 10).
отдел(зкм, подсобные_работы, 60).
отдел(электромаш, сварка, 50).
отдел(электромаш, упаковка, 50).
отдел(кзэсо, сварка, 50).
отдел(кзэсо, упаковка, 40).
отдел(кзэсо, проектирование, 10).
отдел(кзэсо, охрана, 10).
отдел(кзэсо, сборка, 40).

товар(севмаш, хлеб).
товар(кзэсо, свар_аппараты).
товар(зкм, двигатели).
товар(электромаш, приборы).
товар(муссон, продукты).

все_о_предприятии(Имя, Количество_человек, Товар) :-
предприятие(Имя), персонал(Имя, Количество_человек), товар(Имя, Товар).

большое_предприятие(Имя, Количество) :-
персонал(Имя, Количество), Количество >=100.

среднее_предприятие(Имя, Количество) :-
персонал(Имя, Количество), Количество >=50, Количество <100. малое_предприятие(Имя, Количество) :- персонал(Имя, Количество), Количество <50. большие_отделы(Имя, Название, Количество) :- отдел(Имя, Название, Количество), Количество >=50.

Запросы:
Среднее по количеству человек предприятие.
?- среднее_предприятие(Имя, Количество).
Имя = муссон,
Количество = 50 ;
false.

Вся основная информация об предприятии.
?- все_о_предприятии(севмаш, Персонал, Товар).
Персонал = 35,
Товар = хлеб.

?- большие_отделы(зкм, Название, Людей).
Название = подсобные_работы,
Людей = 60.

Информация об отделах КЗЭСО
?- отдел(кзэсо, Название, Людей).
Название = сварка,
Людей = 50 ;
Название = упаковка,
Людей = 40 ;
Название = проектирование,
Людей = 10 ;
Название = охрана,
Людей = 10 ;
Название = сборка,
Людей = 40.

Отделы предприятий в которых по 50 людей
?- отдел(Имя, Название, 50).
Имя = электромаш,
Название = сварка ;
Имя = электромаш,
Название = упаковка ;
Имя = кзэсо,
Название = сварка ;
false.


Лабораторная работа №2
Цель работы
Исследование и разработка простейшей экспертной системы. Изучение понятий сопоставления и конкретизации переменных в Прологе. Декларативная и процедурная семантика.

Задание

Представить приведенную ниже логическую задачу в виде предикатов и фактов на языке Prolog, составить целевое утверждение и ответить на вопрос задачи:
Три друга - Петр, Роман и Сергей - учатся на математическом, физическом и химическом факультетах. Если Петр - математик, то Сергей не физик. Если Роман не физик, то Петр - математик. Если Сергей не математик, то Роман - химик. Какая специальность у Сергея.

У нас есть три условия:
1) Если Петр — математик, то Сергей не физик.
2) Если Роман не физик, то Петр — математик.
3) Если Сергей не математик, то Роман — химик.

Код программы:
/*База знаний*/
u4enik(petr).
u4enik(roman).
u4enik(sergey).

predmet(matematika).
predmet(phizika).
predmet(himiya).

/* Если у Петра математика, то у Сергея не физика*/
uslovie1(Predmet1,Predmet3):-
Predmet1 = matematika, Predmet3\=phizika.

/*Если у Романа не физика, то у Петра — математика*/
uslovie2(Predmet1,Predmet2):-
Predmet2 \= phizika, Predmet1 = matematika.
/*Если у Сергея не математика, то у Романа — химия*/
uslovie3(Predmet2,Predmet3):-
Predmet3 \= matematika, Predmet2 = himiya.

/*ф-ция вызывает ф-ции-условия */
u4enik_predmet2(Name1,Name2,Name3,Predmet1,Predmet2,Predmet3):-
Name1=petya,Name2=roman,Name3=sergey,
predmet(Predmet1),predmet(Predmet2),predmet(Predmet3),
Predmet1\=Predmet2,
Predmet2\=Predmet3,
Predmet1\=Predmet3,
uslovie1(Predmet1,Predmet3);
uslovie2(Predmet1,Predmet2);
uslovie3(Predmet2,Predmet3).

Вывод программы:
?- u4enik_predmet2(Name1,Name2,Name3,Predmet1,Predmet2,Predmet3).
Name1 = petya,
Name2 = roman,
Name3 = sergey,
Predmet1 = matematika,
Predmet2 = phizika,
Predmet3 = himiya ;
false.

Единственный подходящий вариант по мнения нашей экспертной системы.

Лабораторная работа №4
1. Цель работы

Исследование способов представления знаний. Составление и программирование алгоритма поиска ответа по семантической сети.

2. Варианты заданий

Представить данные в виде семантической сети. Написать программу, которая отвечала бы на вопрос пользователя. Вопрос, заданный на естественном языке, представить в виде фрагмента семантической сети и написать программу поиска этого фрагмента в заданной семантической сети. Вопрос и данные выбираются по варианту задания.
Данные 2. Средством передвижения по воде служат морские суда. Корабли можно условно разделить на военные и гражданские. Военные суда оснащены различным вооружением. Военные суда в свою очередь разделяются на подводные и надводные корабли. Подводные корабли оснащены торпедными установками, а надводные – орудийными установками. Определение местоположения противника надводные корабли устанавливают с помощью радар. Подводные корабли для этой цели используют сонар. К подводным кораблям можно отнести подводные лодки и батискафы, к надводным можно отнести линкор и крейсер. Рыболовецкие и круизные суда являются гражданскими судами. Гражданские суда в качестве локатора используют радар. Рыболовецкие суда оснащены рыболовецкими снастями. На этих судах в основном используются дизельные двигатели. Примерами рыболовецких судов могут служить тральщик и китобойное судно. Круизные суда бывают речные и морские. Они имеют комфортабельные условия для отдыха пассажиров. На круизных судах в основном устанавливают бензиновые двигатели.
1. Данные 2. Какие существуют военные корабли?
net(корабли,это,транспорт).
net(военные,это,корабли).
net(гражданские,это,корабли).
net(военные,имеют,оружие).
net(военные,подразделяются_на,надводные).
net(военные,подразделяются_на,подводные).
net(подводные,имеют,торпеды).
net(надводные,имеют,орудия).
net(надводные,обнаруживают,радаром).
net(подводные,обнаруживают,сонаром).
net(подводные, подразделяются_на,субмарины).
net(подводные, подразделяются_на, батискафы).
net(надводные, подразделяются_на, крейсеры).
net(надводные, подразделяются_на, линкоры).
net(гражданские, подразделяются_на, рыболовецкие).
net(гражданские, подразделяются_на, круизные).
net(гражданские, обнаруживают, радаром).
net(рыболовецкие, оснащены, снастями).
net(рыболовецкие, имеют_двигатель, дизельный).
net(рыболовецкие, подразделяются_на,тральщики).
net(рыболовецкие, подразделяются_на,китобойные).
net(круизные, подразделяются_на,морские).
net(круизные, подразделяются_на,речные).
net(круизные, имеют,места_отдыха).
net(круизные, имеют_двигатель, бензиновый).
%%question
question(военные,подразделяются_на,_).

rule1(_Object,Property,Value):-
net(_Object,Prop,Parent),Prop=это,net(Parent,Property,Value);
net(_Object,Prop,Parent),Prop=подразделяются_на, net(Parent,Property,Value).

rule2(_Object,Property,Value):-
net(_Object,Property,Value);rule1(_Object,Property,Value).

result(G):-
question(X,Y,_),rule2(X,Y,G).


Это лишь несколько лабораторных работ из рассматриваемых нами в университете. На самом деле их больше на порядок.

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

Комментариев нет:

Отправить комментарий