НОВОСИБИРСК 2013

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

 

«Сибирская Государственная Геодезическая Академия»

Лабораторная работа № 1

по дисциплине «Искусственный интеллект»

на тему: «Знакомство с основами логического программирования».

 

 

Выполнил:

студент

группы ОЗИ-31

Дикусар С.Ю.

.

Проверил:

Сырецкий Г. А.

 

 

НОВОСИБИРСК 2013

 

Цель работы: изучение средств интегрированной среды (ИС) научиться пользоваться им для разработки и отладки программ.

Порядок выполнения:

1. Запуск системы;

2. Ввод программы в среду редактора;

3. Сохранение программы на диске;

4. Запуск программы на выполнение;

5. Корректировка синтаксических ошибок;

6. Просмотр файлов на диске;

7. Трассирование программы;

8. Завершение работы.

1.Из папки PDCProlog321 с рабочего стола запускаем PROLOG,и на экране появляется меню программы


Чтобы перейти в окно редактора нажимаем Alt+E

Активируется команда главного меню Edit


2.Набираем программу умножения любого числа на 25

 

3.Чтобы сохранить программу на диск, выбираем из меню File элемент разворачивающегося меню Write to(записать в). Вводим в появившемся диалоговом окне имя файла, в нашем случае Mult

4.Чтобы запустить программу на компиляцию, нажимаем Alt+R. Запускается команда Run(запуск) в главном меню.


В окне Message появится сообщение о компиляции программы в память и запуске программы.


В окне диалога появится приглашение на ввод. После выполнения программы последует запрос на нажатие клавиши пробел.

После нажатия клавиши пробел, в окне сообщений появится сообщение об успешном завершении программы.

5.Если допущена ошибка, программа сообщение об ошибке, а курсор укажет на место, где была совершена ошибка. После исправления ошибки нажимаем клавишу F10 для продолжения работы.

Для компиляции текстовой программы в автономный EXE-файл, который можно запускать автономно от среды программирования, нужно:

1. Выбрать элемент главного меню Compile( комбинация клавиш Alt и C).

2. Выбрать из меню Compile вариант EXE (нажать E).

После успешной компиляции ответить yes(Да), на запрос: Execute(y/n) (Запускать (да/нет), нажать клавишу y.

Если компиляция прошла успешно, то в окне Message появится сообщение Link succeeeded.

 

При нажатии клавиши F5 входим в полноэкранных режим выделенного окна(в данном случае,- редактора).

 

При повторном нажатии клавиши вернёмся к исходному виду.

6. Возвратимся в окно редактирования при помощи комбинации клавиш Alt и E.

Совершим несколько синтаксических ошибок: после слова goal поставим точку, а reading(X) записать с ошибкой как radint(X). Повторно запускаем программу нажатием Alt и R. В последней строке окна редактирования появится сообщение, говорящее об ошибке:

419 Syntax error in clause body, predicate call expected. (Синтаксическая ошибка внутри описания факта, ожидается название предиката).

Курсор укажет некорректно поставленную точку. Сотрём точку, и вновь запустим программу нажатием F10. Программа перезапустится, и система определит вторую ошибку (radint(X)) и сообщит:

404 Undeclared predicate or misspelling(404 Необъявленный или орфографически неправильно написанный домен.)

Исправим ошибку и снова нажмём F10. На этот раз программа должна откомпилироваться и запуститься нормально. В начале программы напишем директиву diagnostics, с помощью которой получим следующую информацию:

-имён использованных предикатов(Predicate Name);

-область действия предикатов(Type – локальный, глобальный определённый внешне);

-детерминистичность/недетерминистичность предикатов(Determ);

-размер кода для предиката (Size);

-типы доменов и назначение параметров (Domains -- flowpattern)

Удалим из программы указанную директиву.

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

7. Для просмотра файлов в текущем каталоге выбрать в меню Files(нажав Alt и F) пункт Directory. Пролог выдаст в окно ввода запрос Enter file mask(Введите маску файла). Можно использовать маску, принятую по умолчанию (* *), что приведёт к выдаче всех файлов из текущего каталога. Если задать *.PRO, то Пролог выведет на экран имена всех файлов с *.PRO, находящихся в текущем каталоге.

Проверим содержание каталога:

9. Загрузим в окно редактирования программу: из меню File запустим директиву Load.

В диалоговом окне укажем *.PRO:

Из окна со списком файлов указанного типа выберем требуемый файл.

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

С помощью комбинации Alt+R. В окне редактирования курсор находится в начале программы, в окне трассировки отобразится первый шаг этой программы:

CALL: _PROLOG_Goal()

Нажмём F10, в окне трассировки появится сообщение: write(“\nVvedite chislo -> “)

Ещё раз нажмём F10, в окне трассировки появится сообщение: CALL: readint(_)

Ещё раз нажмём F10, в окне Диалога появится мигающих курсор, приглашающий на ввод.

Введём 2 и нажмём Enter.

В окне трассирования появится сообщение: RETURN: readint(2)

 

Последующие нажатия F10 вызывают появление в окне трассирования такого текста:

50=50

write(“\nProizvedenie chisla”)

write(2)

write(“n\na chislo 25 ravno “)

write(50)

RETURN: _PROLOG_Goal()

\

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

10. Завершение работы

Для выхода из системы нажмём одновременно две клавиши Alt и X либо открыть меню Files и нажать клавишу Q.

Контрольные вопросы

1.С помощью команды Ctrl-K отмечаем блок, командой Ctrl-F5 копируем выделенный текстовый блок, и при повторном нажатии Ctrl-F5 – вставляем текст в то место, где находится курсор.

2. Клавиша F10 служит для того, чтобы перейти из конкретного окна в главное меню.

3. С помощью клавиши F6 можно переходить от одного окна к другому.

Задание (типовое) :

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

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

Написать программу без использования внутренней цели (без секции GOAL).

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

 

Сын
Отец
Мать
Дедушка
Бабушка
Дедушка
Бабушка
Тётя
Дядя
Кузен
Кузина
Sergey
Mitya
Gerald
Lyudmila
Yuriy
Larisa
Viktor
Svyeta
Nina
Diana
Maksim

 


Исходный текст:

PREDICATES секция описания предикатов

parent(string,string) описание доменов предиката(строка)

man(string) описание доменов предиката (строка)

woman(string) описание доменов предиката (строка)

married(string,string) описание доменов предиката (строка)

mother(string,string) описание доменов предиката (строка)

father(string,string) описание доменов предиката (строка)

sister(string,string) описание доменов предиката (строка)

brother(string,string) описание доменов предиката (строка)

niece(string,string) описание доменов предиката (строка)

nephew(string,string) описание доменов предиката (строка)

aunt(string,string) описание доменов предиката (строка)

uncle(string,string) описание доменов предиката (строка)

grandmother(string,string) описание доменов предиката (строка)

grandfather(string,string) описание доменов предиката (строка)

granddaughter(string,string) описание доменов предиката (строка)

grandson(string,string) описание доменов предиката (строка)

cousine(string,string) описание доменов предиката (строка)

cousin(string,string) описание доменов предиката (строка)

CLAUSES секция предложений. Факты и правила вывода

parent(“Yuriy”,”Sergey”). запись факта Юрий является родителем для Сергея

parent(“Larisa”,”Sergey”). запись факта Лариса является родителем для Сергея

parent(“Gerald”,”Yuriy”). запись факта Геральд является родителем для Юрия

parent(“Gerald”,”Mitya”). запись факта Геральд является родителем для Мити

parent(“Lyudmila”,”Yuriy”). запись факта Людмила является родителем для Юрия

parent(“Lyudmila”,”Mitya”). запись факта Людмила является родителем для Мити

parent(“Viktor”,”Larisa”). запись факта Виктор является родителем для Ларисы

parent(“Viktor”,”Svyeta”). запись факта Виктор является родителем для Светы

parent(“Nina”,”Larisa”). запись факта Нина является родителем для Ларисы

parent(“Nina”,”Svyeta”). запись факта Нина является родителем для Светы

parent(“Svyeta”,”Maksim”). запись факта Света является родителем для Максима

parent(“Svyeta”,”Diana”). запись факта Света является родителем для Дианы

man(“Yuriy”). запись факта Юрий - мужчина

man(“Sergey”). запись факта Сергей - мужчина

man(“Gerald”). запись факта Геральд - мужчина

man(“Viktor”). запись факта Виктор - мужчина

man(“Mitya”). запись факта Митя - мужчина

man(“Maksim”). запись факта Максим - мужчина

woman(“Larisa”). запись факта Лариса - женщина

woman(“Lyudmila”). запись факта Людмила - женщина

woman(“Nina”). запись факта Нина - женщина

woman(“Svyeta”). запись факта Света - женщина

woman(“Diana”). запись факта Диана - женщина

married(“Yuriy”,”Larisa”). факт отношений Юрий женат на Ларисе

married(“Gerald”,”Lyudmila”). факт отношений Геральд женат на Людмиле

married(“Viktor”,”Nina”). факт отношений Виктор женат на Нине

mother(M,X):-parent(M,X),woman(M). M-мама X, если M родитель X , и M-женщина

father(F,X):-parent(F,X),man(F). F – папа X, если F родитель X, и F-мужчина

sister(S,X):-parent(P,S),parent(P,X),S<>X,woman(S). S-сестра для X если P-родитель для S и P-родитель для Х, S не X, и S-женщина

brother(B,X):-parent(P,B),parent(P,X),B<>X,man(B). B-брат для X если P-родитель для B и P-родитель для Х, B не X, и B-мужчина

niece(N,X):-parent(P,N),sister(P,X),woman(N). N-племянница для X если Р-родитель для N и Р-сестра для X и N-женщина

niece(N,X):-parent(P,N),brother(P,X),woman(N). N-племянница для X если Р-родитель для N и Р-брат для X и N-женщина

nephew(N,X):-parent(P,N),sister(P,X),man(N). N-племянник для Х если Р-родитель для N и Р-сестра для Х и N-мужчина

nephew(N,X):-parent(P,N),brother(P,X),man(N). N-племянник для Х если Р-родитель для N и Р-брат для Х и N-мужчина

aunt(A,X):-niece(X,A),woman(A).

aunt(A,X):-nephew(X,A),woman(A).

uncle(U,X):-niece(X,U),man(U).

uncle(U,X):-nephew(X,U),man(U).

grandmother(G,X):-woman(G),parent(P,X),parent(G,P).

grandfather(G,X):-man(G),parent(P,X),parent(G,P).

granddaughter(G,X):-woman(G),parent(P,G),parent(X,P).

grandson(G,X):-man(G),parent(P,G),parent(X,P).

cousine(C,X):-woman(C),aunt(A,X),mother(A,C).

cousine(C,X):-woman(C),uncle(U,X),father(U,C).

cousin(C,X):-man(C),aunt(A,X),mother(A,C).

cousin(C,X):-man(C),uncle(U,X),father(U,C).

2.Интерфейс программы