Главная страница

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


Скачать 0.73 Mb.
НазваниеПрактикум решения задач по курсу Основы искусственного интеллекта
Дата17.11.2022
Размер0.73 Mb.
Формат файлаdoc
Имя файлаmetod_VP.doc
ТипПрактикум
#795277
страница6 из 8
1   2   3   4   5   6   7   8

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ


1. Трое ребят вышли гулять с собакой, кошкой и хомячком. Известно, что Петя не любит кошек и живет в одном подъезде с хозяйкой хомячка. Лена дружит с Таней, гуляющей с кошкой. Определить, с каким животным гулял каждый из детей.

2. Беседуют трое друзей: Белокуров, Рыжов и Чернов. Брюнет сказал Белокурову: «Любопытно, что один из нас блондин, другой – брюнет, а

третий – рыжий, но ни у кого цвет волос не соответствует фамилии». Какой цвет волос у каждого из друзей?

3. Витя, Юра, Миша и Дима сидели на скамейке. В каком порядке они сидели, если известно, что Юра сидел справа от Димы, Миша справа от Вити, а Витя справа от Юры.

4. Известно, что Волга длиннее Амударьи, а Днепр короче Амударьи. Лена длиннее Волги. Определить вторую по протяженности реку.

Отчет о выполненной самостоятельной работе должен содержать:

  1. тему лабораторной работы;

  2. условие задачи;

  3. решение задачи традиционным способом (с помощью таблицы);

  4. листинг программы;

  5. результаты ее тестирования с различными исходными данными.

1.9 Списки

Список – это объект, который содержит конечное число других объектов. Список в ПРОЛОГе заключается в квадратные скобки и элементы списка разделяются запятыми. Список, который не содержит ни одного элемента, называется пустым списком.

Список является рекурсивным объектом. Он состоит из головы (первого элемента списка) и хвоста (все последующие элемента). Хвост также является списком. В ПРОЛОГе имеется операция “|”, которая позволяет делить список на голову и хвост. Пустой список нельзя разделить на голову и хвост.

Тип данных "список" объявляется в программе на Прологе следующим образом:

DOMAINS

списковый_тип = тип*

где "тип" - тип элементов списка; это может быть как стандартный тип, так и нестандартный, заданный пользователем и объявленный в разделе DOMAINS ранее.

Основными операциями на списками являются:

  • формирование списка;

  • объединение списков;

  • поиск элемента в списке;

  • вставка элемента в список и удаление из списка.



Пример 1

Сформировать список вида [7,6,5,4,3,2,1]

Решение

DOMAINS

list = integer*

PREDICATES

genl(integer, list)

CLAUSES

genl(0,[]):-!.

genl(N,[N|L]):-N1=N-1, genl(N1,L).

GOAL

genl(7,L),write(L),nl.
Результат выполнения программы:

[7,6,5,4,3,2,1]
Пример 2

Сформировать список из N элементов, начиная с 2. Каждый следующий на 4 больше предыдущего.

Решение

DOMAINS

list = integer*

PREDICATES

genl( integer, integer, list )

CLAUSES

genl(N2,N2,[]):-!.

genl(N1,N2,[N1|L]):-N1
genl(N,N2,L).

GOAL

write("N="),readint(N),K=4*(N+1)-2,

genl(2,K,L),write(L),nl.
Результат выполнения программы:

N=5

[2,6,10,14,18]
Пример 3

Сформировать список последовательных натуральных чисел от 4 до 20 и найти количество его элементов.

Решение:

DOMAINS

list = integer*

PREDICATES

genl1(integer, integer, list )

len(integer, list )

CLAUSES

genl1(N2,N2,[]):-!.

genl1(N1,N2,[N1|L]):-N1
len(0,[]).

len(X,[_|L]):-len(X1,L), X=X1+1.

GOAL

genl1 (4,21,L ),write(L),nl,

len(X, L),write("Количество элементов=",X),nl.

Результат выполнения программы:

[4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

Количество элементов=17
Пример 4

Определить, содержится ли введенное число Х в заданном списке L.

Решение:

DOMAINS

list = integer*

PREDICATES

member(integer, list)

CLAUSES

member(X,[X|_]):-write("yes"),!.

member(X,[]):-write("no"),!.

member(X,[_|L]) :- member(X, L).

GOAL

L=[1,2,3,4], write(L),nl, write("X="),readint(X),

member(X, L),nl.
Результат выполнения программы:

1-й случай:

[1,2,3,4]

X=3

yes

2-й случай:

[1,2,3,4]

X=5

no
Пример 5

Сформировать списки L1=[1,2,3], L2=[10,11,12,13,14,15] и объединить их в список L3.

Решение:

DOMAINS

list = integer*

PREDICATES

genl1(integer,integer,list)

append(list,list,list)

CLAUSES

genl1(N2,N2,[]):-!.

genl1(N1,N2,[N1|L]):-N1
append([],L,L).

append([X|L1],L2,[X|L3]):-append(L1,L2,L3).

GOAL

genl1(1,4,L1),write("L1=",L1),nl,

genl1(10,16,L2),write("L2=",L2),nl,

append(L1,L2,L3),write("L3=",L3),nl.

Результат выполнения программы:

L1=[1,2,3]

L2=[10,11,12,13,14,15]

L3=[1,2,3,10,11,12,13,14,15]
Пример 6

Удалить из списка, элементами которого являются названия дней недели, указанный элемент.

Решение:

DOMAINS

list = symbol*

PREDICATES

del(symbol,list,list)

CLAUSES

del(X,[X|L],L).

del(X,[Y|L],[Y|L1]):-del(X,L,L1).

GOAL

L=[пн, вт, ср, чт, пт, сб, вс],write("L=",L),nl,

write("X="),readln(X),

del(X,L,L1),write("L1=",L1),!;

write("Элемент отсутствует в списке"),nl.
Результат выполнения программы:

1-й случай:

L=["пн","вт","ср","чт","пт","сб","вс"]

X=ср

L1=["пн","вт","чт","пт","сб","вс"]

2-й случай:

L=["пн","вт","ср","чт","пт","сб","вс"]

X=пр

Элемент отсутствует в списке
Пример 7

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

Решение:

DOMAINS

list = symbol*

PREDICATES

del(symbol,list,list)

ins(symbol,list,list)

CLAUSES

del(X,[X|L],L).

del(X,[Y|L],[Y|L1]):-del(X,L,L1).

ins(X,L1,L):-del(X,L,L1).

GOAL

L=[olga, oksana, toma, dima],write("L=",L),nl,

write("X="),readln(X),

ins(X,L,L1),write("L1=",L1),nl, fail.
Результат выполнения программы:

L=["olga","oksana","toma","dima"]

X=vera

L1=["vera","olga","oksana","toma","dima"]

L1=["olga","vera","oksana","toma","dima"]

L1=["olga","oksana","vera","toma","dima"]

L1=["olga","oksana","toma","vera","dima"]

L1=["olga","oksana","toma","dima","vera"]
Пример 8

Найти сумму элементов списка целых чисел.

Решение:

DOMAINS

list=integer*

PREDICATES

sum_list(list, integer)

CLAUSES

sum_list([],0).

sum_list([X|L],S):-sum_list(L,S1),S=S1+X.

GOAL

L=[1,2,3,4,5],sum_list(L,S), write("S=",S).
Результат выполнения программы:

S=15

ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

  1. Сформировать список [2, 4, 6, 8, 10] и удалить из него введенное число.

  2. Сформировать списки [1, 3, 5, 7, 9] и [2, 4, б, 8, 10] и объединить их в один.

  3. Сформировать список [3, 6, 9, 12, 15, 18] и вставить в него введенное число.

  4. Сформировать список из N натуральных чисел, начиная с 10. Каждое следующее на 5 больше предыдущего.

  5. Сформировать список [3, 6, 9, 12, 15] и найти сумму его элементов

  6. Сформировать список [6, 5, 4, 3, 2] и найти сумму его элементов

  7. Сформировать список [7, 5, 3, 1] и найти произведение его элементов

  8. Сформировать список из N последовательных натуральных чисел, начиная с 10. Найти сумму его элементов


Отчет о выполненной самостоятельной работе должен содержать:

  1. тему лабораторной работы;

  2. условие задачи;

  3. листинг программы;

  4. результаты ее тестирования.

2 Разработка графического интерфейса пользователя

2.1 Создание простейших проектов
с графическим интерфейсом


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

При создании проекта с графическим интерфейсом Visual Prolog создает основу проекта, содержащую главное меню, панель инструментов и окно для вывода сообщений. Новое приложение может быть создано за достаточно короткий промежуток времени и затем последовательно расширено до конечного приложения
Пример. Проект, позволяющий ввести имя пользователя и вывести приветствие.

Задание: создать проект, содержащий пункт главного меню test, при выборе которого выводится диалоговое окно для ввода имени пользователя. После завершения ввода должно появиться приветственное сообщение.
Решение

1. Запустите среду Visual Prolog и создайте новый проект (Project | New Project), активизируется окно Application Expert (рис.11).

2. Определите имя проекта (например, MyProj) и базовый каталог, куда будет сохранен проект (например, D:\VP\ MyProj).



рис.11. Диалоговое окно Application Expert

Нажмите Create для создания проекта. Проект с графическим интерфейсом уже создан. Запустите его на выполнение (Project | Run, или клавиша <F9>, или кнопка <R>).


рис.12. Приложение по умолчанию

Проверьте, какие из пунктов главного меню реагируют на действия пользователя. Завершите работу приложения MyProj.

3. Проект по умолчанию – это основа для формирования собственного приложения. Доработайте проект, добавив новый пункт меню Test, при выборе которого должно появиться окно для ввода имени пользователя. После ввода имени должна появиться приветствующая надпись в окне Messages. Для этого выполните действия:

а) создание нового пункта меню: в окне проекта нажмите кнопку Menu на левой панели инструментов, а затем двойным щелчком активизируйте редактор меню (или нажмите Edit на правой панели инструментов)


рис.13. Окно проекта, показывающее зарегистрированное меню

В открывшемся окне выделите пункт меню Edit и нажатием кнопки New добавьте новый пункт меню (рис.14).




.

рис.14. Добавление пункта меню в редакторе меню

Введите название пункта меню &Test. Имя-константа для него будет присвоено автоматически

Нажмите ОК, а затем Close для закрытия окна Task Menu.

Сохраните сделанные в меню изменения

б) создание диалогового окна для ввода имени пользователя: в окне проекта нажмите кнопку Window на левой панели инструментов, а затем вызовите эксперт окон нажатием кнопки Code Expert . Откроется окно Dialog and Window Expert (рис.15)



рис.15. Эксперт окон и диалоговых окон создает код меню

Выберите пункт Menu в списке Event Type и выделите строку id_test (имя нового пункта меню). Нажмите кнопку Add Clause, чтобы сгенерировать Пролог-предложение для события. Название кнопки изменится на Edit Clause, когда код для события будет создан. Нажмите кнопку Edit Clause. Откроется окно редактора для файла MyProj.pro, в который добавлено предложение:

%BEGIN Task Window, id_test

task_win_eh(_Win,e_Menu(id_test,_ShiftCtlAlt),0):-!,

!.

%END Task Window, id_test



рис.16. Окно редактора кода

Поместите курсор в указанную точку, а затем щелкните правой кнопкой мыши и выберите и выберите команду Insert | Predicate Call | Window, Dialog or Toolbar

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



рис.17. Определение предиката для вставки

Вызов диалогового окна dlg_GetStr будет вставлен в текст и код предложения должен выглядеть следующим образом:

%BEGIN Task Window, id_test

task_win_eh(_Win,e_Menu(id_test,_ShiftCtlAlt),0):-!,

Msg="Message",

InitStr="",

Title="Title",

_NewSTRING=dlg_GetStr(Title,Msg,InitStr),

!.

%END Task Window, id_test
Для окончательной доработки внесите следующие изменения (выделены жирным шрифтом):

%BEGIN Task Window, id_test

task_win_eh(_Win,e_Menu(id_test,_ShiftCtlAlt),0):-!,

Msg="Введите Ваше имя", % строка-подсказка

InitStr="", % исходное значение вводимой пользователемстроки

Title="Ввод имени пользователя", % заголовок окна

_NewSTRING=dlg_GetStr(Title,Msg,InitStr),% введенная

строка

_NewSTRING<>"", % если введенная строка не пустая,

write("Привет, ",_NewSTRING), % то выводится приветствие

!.

%END Task Window, id_test
4. Запустите проект на исполнение и протестируйте его.
1   2   3   4   5   6   7   8


написать администратору сайта