Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курсовой проект - Написание программ на языке Prolog

.doc
Скачиваний:
73
Добавлен:
02.05.2014
Размер:
171.52 Кб
Скачать

Уфимский государственный авиационный технический университет

Курсовой проект

по  дисциплине

«Системы искусственного интеллекта»

Вариант 12

Специальность 230102 Автоматизированные системы

обработки информации и управления

Факультет информатики и робототехники

Кафедра автоматизированных систем управления

Курс 4

Семестр 8

Оценка ________________ Исполнитель

Консультант проф. каф. АСУ студ. гр.

(зач. кн. )

________ Алыпов Ю.Е. _______.

«___» ____________ 2007 г. «___» ___________ 2007 г.

Содержание

  1. Введение…………………………………………………………………3

  2. Задачи на проектирование……………………………………………...4

2.1. Задание 1……………………………………………………………......4

2.2. Задание 2………………………………………………………………..6

2.3. Задание 3………………………………………………………………..7

  1. Список литературы………………………………………………..……..7

Приложение………………………………………………………..……..8

Введение.

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

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

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

Программирование на Прологе состоит в определении отношений и в постановке вопросов, касающихся этих отношений. Программа состоит из предложений. Предложения бывают трех типов: факты, правила и вопросы. Отношение может определяться фактами, перечисляющими n объектов, для которых это отношение выполняется, или же оно может определяться правилами. Процедура - это множество предложений об одном и том же отношении. Вопросы напоминают запросы к некоторой базе данных. Они состоят из одного или более целевых утверждений (или кратко целей). Пролог-система рассматривает вопросы как цели, к достижению которых нужно стремиться. Ответ системы на вопрос представляет собой множество объектов, которые удовлетворяют запросу. Ответ на вопрос может оказаться или положительным или отрицательным в зависимости от того, может ли быть соответствующая цель достигнута или нет. В случае положительного ответа мы говорим, что соответствующая цель достижима и успешна. В противном случае цель недостижима, имеет неуспех или терпит неудачу. Если на вопрос существует несколько ответов, пролог-система найдет столько из них, сколько пожелает пользователь.

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

Пролог-программа состоит из предложений. Каждое предложение заканчивается точкой. Аргументы отношения могут быть (среди прочего): конкретными объектами, или константами, или абстрактными объектами, такими, как X и Y. Объекты первого типа называются атомами. Объекты второго типа - переменными.

Задание 1.

Цель - Знакомство с основами логического программирования (Prolog).

Используя предикаты parent(symbol,symbol), man(symbol), woman(symbol), married(symbol,symbol), записать факты, описывающие Вашу семью. Записать 8 правил вывода для любых родственных отношений в Вашей семье (например: мать, отец, сестра, брат, племянница, племянник, тетя, дядя, внучка, внук, бабушка, дедушка, двоюродная сестра, двоюродный брат и т.д.).

Рис1. Дерево родственных отношений

Листинг программы.

PREDICATES

parent(String,String)

man(String)

woman(String)

married(String,String)

plem(String,String)

mother(String,String)

father(String,String)

grandma(String,String)

grandfa(String,String)

son(String,String)

brother(String,String)

print

CLAUSES

man("Evgeniy").

man("Alex").

man("Iliya").

man("Yan").

man("Sergey").

woman("Olga").

parent("Evgeniy","Alex").

parent("Evgeniy","Iliya").

parent("Olga","Alex").

parent("Olga","Alex").

parent("Iliya","Yan").

parent("Iliya","Sergey").

married("Evgeniy","olga").

mother(X,Y):-woman(X),parent(X,Y).

father(X,Y):-man(X),parent(X,Y).

son(X,Y):-man(Y),parent(X,Y).

grandma(X,Z):-parent(X,Y),parent(Y,Z),woman(X).

grandfa(X,F):-parent(X,Y),parent(Y,F),man(X).

brother(X,Y):-parent(Z,X),parent(Z,Y),man(X),X<>Y.

plem(X,F):-parent(Z,F),man(F),parent(P,X),parent(P,Z),Z<>X.

print:-mother(X,Y),write(X,"-mother-",Y),nl,fail.

print:-father(X,Y),write(X,"-father-",Y),nl,fail.

print:-son(X,Y),write(Y,"-son-",X),nl,fail.

print:-grandma(X,Z),write(X,"-grandma-",Z),nl,fail.

print:-grandfa(X,F),write(X,"-grandfa-",F),nl,fail.

print:-brother(X,Y),write(X,"-brother-",Y),nl,fail.

print:-plem(X,F),write(F,"-plemannik-",X),nl,fail.

print.

GOAL

print,

readln(I).

Вывод.

Построив дерево родственных отношений, и используя язык логического программирования Prolog, я написал программу, в которой отображаются все родственные отношения, с помощью заданных правил и фактов. Использовались такие предикаты, как parent(string, string), man(string), woman(string), married(string ,string).

Задание 2. (7)

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

PREDICATES operation(symbol,real,real) GOAL write("Enter number"),nl,readreal(X),nl,readreal(Y),nl, operation("+",X,Y), operation("-",X,Y), operation("*",X,Y), operation("/",X,Y). CLAUSES operation("+",X,Y):-Z=X+Y, write(X,"+",Y,"=",Z),nl. operation("-",X,Y):-Z=X-Y, write(X,"-",Y,"=",Z),nl. operation("*",X,Y):-Z=X*Y, write(X,"*",Y,"=",Z),nl. operation("/",X,Y):-Z=X/Y, write(X,"/",Y,"=",Z),

nl,readln(I).

Вывод.

Используя язык логического программирования Prolog, я написал программу, реализующую четыре арифметические действия над двумя числами: сложение, вычитание, деление и умножение. В программе использовался предикат operation(symbol,real,real).

Задание 3.(2)

Подсчитать, сколько раз встречается некоторая буква в строке. Строка и буква должны вводиться с клавиатуры. Для разделения строки на символы использовать стандартный предикат frontchar (String, Char, StringRest), позволяющий разделять строку String на первый символ Char и остаток строки StringRest.

PREDICATES

count(string,char,integer)

CLAUSES

count(Str,Ch,Counter):-

frontchar(Str,H,T),

Str<>"",H=Ch,!,

New_Counter=Counter+1,

count(T,Ch,New_Counter).

count(Str,Ch,Counter):-

frontchar(Str,H,T),

H<>Ch,Str<>"",!,

count(T,Ch,Counter).

count(_,Ch,Counter):-write("Simvol `",Ch,"` vstrechaetsa v kolichestve ",Counter).

GOAL

write("Input string: "), readln(Str),

write("Input char: "), readchar(Ch), write(Ch),readln(X),

Amount=0, count(Str,Ch,Amount),nl,

readln(KLJ).

Вывод.

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

Список литературы.

  1. И. Братко Программирование на языке Пролог для искусственного интеллекта: Пер. с англ.-М.: Мир, 1990.- 560 с.

  2. Ин Ц., Соломон Д. Использование Турбо-Пролога. – М.: Мир, 1993. – 608 С.

  3. Доорс Дж., Рейблейн А.Р., Вадера С. Пролог ‑ язык программирования будущего. – М.: ФиС, 1990. – 144 С.

  4. Стерлинг Л., Шапиро Э. Искусство программирования на языке Пролог. – М.: Мир, 1990. – 235 с.

Приложение

Рисунок к задаче 1.

Рисунок к задаче 2.

Рисунок к задаче 3.

9