Автор работы: Пользователь скрыл имя, 15 Февраля 2013 в 20:44, курсовая работа
Турбо-Пролог (Turbo Prolog) является языком искусственного интеллекта (ИИ). Разработан этот язык компанией Borland International и характеризуется высокой скоростью работы и низкой стоимостью, что делает Турбо-Пролог весьма популярным в широких кругах обладателей персональных компьютеров.
Содержание 1
Глава 1. Описание языка Турбо-Пролог 2
1.1 Введение 2
1.2 Пакет системы Турбо-Пролог 5
1.2.1 Главное меню системы Турбо-Пролог 6
1.2.2 Запуск на счет программы, написанной на Турбо-Прологе 7
1.2.3 "Добро пожаловать в систему Турбо-Пролог!" 7
1.2.4 Сохранение программного файла 8
1.2.5 Просмотр каталога директории 8
1.2.6 Загрузка и редактирование программного файла 9
1.3 Заключение 10
Глава 2. Основные понятия языка Турбо-Пролог 11
2.1 Ведение 11
2.2 Декларативные и императивные языки 11
2.2.1 Логика предикатов 12
2.2.2 Пролог и логика предикатов 14
2.3 Управление программой 16
2.3.1 Цели программы 16
2.3.3 Результат доказательства цели 17
2.3.4 Связки и другие символы 17
2.3.5 Цели и подцели 18
2.4 Внутренние подпрограммы унификации Турбо-Пролога 18
2.4.1 Представление данных при помощи фактов и правил 19
2.4.2 Обработка правил и фактов во время унификации 19
2.4.3 Откат 22
2.5 Заключение 23
Глава 3. Основы программирования на Турбо-Прологе 24
3.1 Введение 24
3.2 Структура программ Турбо-Пролога 24
3.2.1 Описание доменов и предикатов 26
3.2.2 Правила образования имен в Турбо-Прологе 29
3.3 Предикаты и утверждения 29
3.3.1 Использование внешних и внутренних целей 30
3.3.2 Предикаты и утверждения разных арностей 33
3.3.3 Отрицание 33
3.4 Арифметика в Турбо-Прологе 35
3.5 Заключение 36
4. Примеры программ на языке Турбо-Пролог 37
5. Заключение 41
Список литературы 43
например, из программы "Конструктор слов" удалить раздел goal и запустить ее на счет, то на экране в окне Dialog возникнет приглашение Goal: . Предположим теперь, что Вы хотите задать вопрос: "Какое слово является
синонимом слова modern?" Так же, как и при записи внутренней цели, переменная Q будет использоваться для представления значения, которое Турбо-Пролог поставит ей в соответствие, используя утверждения базы данных. С ее помощью вопрос формулируется в виде
synonym(modern,Q).
Результатом ввода этого предложения явится картинка экрана. После удовлетворения внешней цели выполнение программы, однако, не завершается. Турбо-Пролог просит ввести следующую внешнюю цель. Таким образом, можно задать столько целей, сколько это представляется необходимым; чтобы остановить этот процесс нужно нажать клавишу Esc при выдаче очередного приглашения.
В формулировке запроса к программе можно использовать не только одну переменную, но и несколько. Если, к примеру, Вы введете две перемен- ные, то программа выдаст все возможные комбинации значений, удовлетво- ряющие данные переменные.
Применение внешних целей бывает полезно при записи коротких целевых формулировок, а также для получения всего набора допустимых значений. Другое преимущество этого средства программирования заключается в том, что оно позволяет адресовать базе данных совершенно произвольные вопросы.
Как уже говорилось в предыдущей главе, при трансляции утверждений Турбо-Пролог контролирует правильность написания имени предиката, количество объектов и типы их доменов. Термин арность
обозначает число объектов утверждения. Так утверждение likes(mary, apples) имеет арность 2.
Рассмотрим в качестве примера такие предикаты разных арностей:
go_home
female(person)
father(person,person)
owns(person,book,book)
Объектами предикатов являются person, book и country. Следующие утверждения используют эти предикаты; арность каждого из них указана в
крайней правой колонке.
Предикат Утверждения Арность
go_home go_home 0
female(person) female(betty) 1
father(person,person) father(john,kathy)
Помимо принадлежности одному и тому же домену, некоторые объекты могут иметь еще некоторое число общих атрибутов. Например, определенные страны Европы имеют общие между собой границы, в то время как другие их не имеют. Предикатом для представления этого отношения служит
border(country,country)
Тот факт, что "Германия и Франция имеют общую границу", можно представить в виде утверждения
border("France", "Germany").
Франция с Германией имеют общую границу, так же как и Франция с
Испанией, и Франция с Италией.
Шесть утверждений задают все возможные пары четырех выбранных европейских стран:
euro_pair("France","Germany").
euro_pair("France","Spain").
euro_pair("France","Italy").
euro_pair("Germany","Spain").
euro_pair("Germany","Italy").
euro_pair("Spain","Italy").
Утверждения для стран с общей границей выглядят так:
border("France","Germany").
border("France","Spain").
border("France","Italy").
Предположим теперь, что вы хотите определить, какие из стран не
имеют общей границы. Вместо того чтобы выдавать на экран все пары стран с общей границей, а потом визуально искать все пары, не попавшие в этот
список, лучше воспользоваться более простым и эффективным средством - отрицанием. Отрицание предиката border задается при помощи предиката
not:
not(border(Country1,Country2))
Этот предикат выдает все пары не граничащих друг с другом стран.
Программа "Пары стран Европы" (листинг 2) - это законченная программа на Турбо-Прологе для решения поставленной задачи.
______________________________
Листинг 2.
/* Программа: Пары стран Европы Файл: PROG002.PRO */
/* Назначение: Демонстрация работы предиката отрицания. */
/* Указание: Цель - внутренняя.
domains
country = symbol
predicates
euro_pair(country,country)
border(country,country)
find_non_border_pair
goal
find_non_border_pair.
clauses
/* факты */
euro_pair("France","Germany").
euro_pair("France","Spain").
euro_pair("France","Italy").
euro_pair("Germany","Spain").
euro_pair("Germany","Italy").
euro_pair("Spain","Italy").
border("France","Germany").
border("France","Spain").
border("France","Italy").
/* правила */
find_non_border_pair :- euro_pair(X,Y), not(border(X,Y)), write(X," - ",Y),nl.
/***** конец программы *****/
______________________________
При программировании на Турбо-Прологе отрицания иногда бывают удобны для логического вывода неких фактов из уже имеющихся в базе данных. И вообще, использование предиката not в конструкции правила
зачастую дает возможность ввести в программу элементы логики.
Турбо-Пролог располагает двумя числовыми типами доменов: целыми и действительными числами. Четыре основные арифметические операции - это сложение, вычитание, умножение и деление. Для их реализации в Турбо-Прологе используются предикаты. Программа "Числа" (листинг 3)
показывает, как можно при помощи предикатов реализовать эти операции.
______________________________
Листинг 3.
/* Программа: Числа */
/* Назначение: Демонстрация реализации арифметики. */
predicates
add(integer,integer).
substruct(integer,integer).
multiply(integer,integer).
divide(integer,integer).
fadd(real,real).
fsubstruct(real,real).
fmultiply(real,real).
fdivide(real,real).
goal
write(" Results"), nl, nl,
add(44, 23),
substruct(44, 23),
multiply(44, 23),
divide(44, 23),
fadd(12.65, 7.3),
fsubstruct(12.65, 7.3),
fmultiply(12.65, 7.3),
fdivide(12.65,7.3), nl,
write(" All done!").
clauses
add(X,Y):- Z = X + Y, write("Sum = ",Z), nl.
substruct(X,Y):- Z = X - Y, write("Diff = ", Z), nl.
multiply(X,Y):- Z = X * Y, write("Pro = ", Z), nl.
divide(X,Y):- Z = X / Y, write("Quo = ", Z), nl.
fadd(P,Q):- R = P + Q, write("Fsum = ",R), nl.
fsubstruct(P,Q):- R = P - Q, write("Fdiff = ",R), nl.
fmultiply(P,Q):- R = P * Q, write("Fpro = ",R), nl.
fdivide(P,Q):- R = P / Q, write("Fquo = ",R), nl.
/***** конец программы *****/
______________________________
Правилами для реализации сложения, вычитания, умножения и деления целых чисел являются
add(X,Y):- Z = X + Y, write("Sum = ", Z), nl.
substruct(X,Y):- Z = X - Y, write("Diff = ", Z), nl.
multiply(X,Y):- Z = X * Y, write("Pro = ", Z), nl.
divide(X,Y):- Z = X / Y, write("Quo = ", Z), nl.
а четырьмя правилами для реализации сложения, вычитания, умножения и
деления действительных чисел:
fadd(P,Q):- R = P + Q, write("Fsum = ",R), nl.
fsubstruct(P,Q):- R = P - Q, write("Fdiff = ",R), nl.
fmultiply(P,Q):- R = P * Q, write("Fpro = ",R), nl.
fdivide(P,Q):- R = P / Q, write("Fquo = ",R), nl.
Внутренняя цель составлена из последовательности утверждений, использующих эти правила. В ее формулировке присутствуют числовые значения, которые передаются в тела правил. Очень важно
соблюсти соответствие типов данных и типов объектов предикатов.
Отметим, что деление целого числа на целое может дать десятичную дробь. В этом случае все знаки вплоть до десятого являются верными.
В главе были рассмотрены основные принципы программирования на Турбо-Прологе. Вы познакомились с такими фундаментальными понятиями, как предикаты, утверждения и домены. Вы также узнали о структуре
и организации программ на Турбо-Прологе. Попутно Вы научились применять внутренние и внешние цели. Обсуждались также техника построения программ на языке Турбо-Пролог и написание простых запросов к базе данных. Материал пояснялся с помощью специально написанных программ, рассматривались способы модификации этих программ в соответствии с потребностями пользователя.
В довершение всего были рассмотрены правила работы с числовой информацией.
Мы рассмотрели основные аспекты языка Турбо-Пролог. Подводя итог данной работы, рассмотрим несколько программ написанных на исследуемом языке.
В листинге 4 представлена программа «Хобби студентов» демонстрирующая простую базу данных, написанную на Турбо-Прологе. Мы имеем один предикат
student(surname,name,pol,
Как можно заметить, этот предикат является описанием студента, включающим в себя фамилию, имя, пол и два хобби. (В последствии, если студент имеет всего лишь одно хобби, мы будем ставить прочерк) Отметим, что все объекты предиката имеют домены, заданные с помощью symbol, исключая объект pol, заданный с помощью домена char.
Мы, используя предикат student, описываем учебную группу.
Также, в программе, уже дана внутренняя цель, которая выводит на экран данные по одному из студентов, используя его фамилию. Внутренняя цель, дана в качестве примера. Конечно, разумнее в базе данных использовать внешнюю цель, что позволит легко использовать все данные БД.
______________________________
Листинг 4.
/* Программа: Хобби Файл: STDHOBBY.PRO */
/* Назначение: Пример базы данных. */
/* Указание: Цель - внутренняя. */
domains
surname,name,hobby = symbol
pol = char
predicates
student(surname,name,pol,
goal
student("Emelyanenko",N,P,H1,
write("surname: Emelyanenko"),nl,
write("name: ",N),nl,
write("pol: ",P),nl,
write("hobby: ",H1,", ",H2).
clauses
student("Bolshakov","Nikita",'
student("Dayanov","Rinat",'M',
student("Emelyanenko","Andrey"
student("Efremova","Nataliya",
student("Kazakova","Marina",'
student("Lipatnikov","Oleg",'
student("Mironov","Aleksandr",
student("Paimakov","Sergei",'
student("Pimenov","Sergei",'M'
student("Pirogov","Evgenii",'
student("Popov","Roman",'M',"
student("Skulkin","Aleksandr",
student("Ushkov","Mihail",'M',
student("Chepakova","Marina",'
student("Yandukin","Nikolai",'
/***** конец программы *****/
______________________________
В листинге 5 представлена программа «Семейное древо». С помощью неё, используя внешние цели, можно узнать степень родства того, или иного человека, на примере фамильного древа вашего покорного слуги.
Данная программа прекрасно демонстрирует то, как нужно формулировать различные правила.
В качестве фактов в программе “Семейное древо” используются имена мужчин, и то, кто кому приходится ребёнком, мужем. Имена женщин отдельно не указывали. Чтобы указать в программе на женщину, мы используем отрицание, то есть, записываем not(man(X)).
______________________________
Листинг 5.
/* Программа: Семейное древо Файл: FM_TREE.PRO */
/* Назначение: Демонстрация формулирования правил */
/* Указание: Цель – внешняя */
predicates
man(symbol)
children(symbol,symbol)
husband(symbol,symbol)
wife(symbol,symbol)
father(symbol,symbol)
mother(symbol,symbol)
son(symbol,symbol)
daughter(symbol,symbol)
parents(symbol,symbol)
predok(symbol,symbol)
grandson(symbol,symbol)
granddaughter(symbol,symbol)
grandfather(symbol,symbol)
grandmother(symbol,symbol)
test(symbol,symbol)
tesha(symbol,symbol)
clauses
/* Факты */
man("Inokentiy").
man("Dmitriy").
man("Boris").
man("Andrey").
man("Aleksey2").
man("Nikolay").
man("Yurii").
man("Aleksandr").
man("Aleksey").
man("Vladimir").
children("Lidiya","Inokentiy")
children("Lidiya","Mariya2").
children("Boris","Dmitriy").
children("Boris","Lidiya").
children("Andrey","Boris").
children("Andrey","Margarita")
children("Margarita","
children("Margarita","Mariya")
children("Yurii","Svetlana").
children("Yurii","Aleksandr").
children("Aleksandr","
children("Aleksandr","Mariya3"
children("Nikolay","Aleksey2")
children("Nikolay","Mariya3").
children("Rimma","Aleksey2").
children("Rimma","Mariya3").
children("Mariya","Aleksey").
children("Mariya","Vera").
children("Nadezhda","Vladimir"
children("Nadezhda","Vera").
children("Nina","Vladimir").
children("Nina","Vera").
husband("Inokentiy","Mariya2")
husband("Dmitriy","Lidiya").
husband("Boris","Margarita").
husband("Aleksandr","Mariya").
husband("Svetlana","Aleksandr"
husband("Aleksey2","Mariya3").
husband("Aleksey","Vera").
husband("Vladimir","Vera").
/* Правила */
wife(X,Y):-husband(Y,X).
father(X,Y):-man(X),children(
mother(X,Y):-children(Y,X), not(man(X)).
son(X,Y):-man(X),children(X,Y)
daughter(X,Y):-children(X,Y),
parents(X,Y):-children(Y,X).
predok(X,Z):-parents(X,Z).
predok(X,Z):-parents(X,Y),
grandson(X,Y):-son(X,Z2),
granddaughter(X,Y):-daughter(