ИИСС. Практикум решения задач по курсу Основы искусственного интеллекта
Скачать 0.73 Mb.
|
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫЗапустите среду Visual Prolog. Откройте проект, указанный преподавателем. Запустите его на исполнение и проверьте его работу. 1.2 Набор, редактирование и тестирование простейших программ в режиме Test Goal Программа на ПРОЛОГе состоит из предложений, которые могут быть фактами, правилами или запросами. Как правило, программа состоит из четырех разделов. DOMAINS – секция описания доменов(типов). Секция применяется, если в программе используются нестандартные домены. PREDICATES – секция описания предикатов. Секция применяется, если в программе используются нестандартные предикаты. CLAUSES – секция предложений. Именно в этой секции записываются предложения: факты и правила вывода. GOAL – секция цели. В этой секции записывается запрос. Среда Visual Prolog позволяет протестировать программу без создания проекта. Для этого используется утилита Test Goal. Достаточно создать новый файл, набрать текст программы и активизировать Test Goal нажатием кнопки Пример 1. Имеется база данных, содержащая следующие факты: родитель(илья, марина). родитель(марина, ира). родитель(елена, иван). родитель(николай, ира). родитель(ольга, алексей). родитель(марина, саша). родитель(сергей, иван). Определить: верно ли, что Марина является родителем Саши; верно ли, что Алексей является родителем Ольги; кто является ребенком Николая; кто родители Ивана; всех родителей и их детей. Решение. 1. Запустите среду Visual Prolog. Закройте окно проекта (если оно открыто) и откройте новый файл (File|New) (рис.2) В появившемся окне наберите текст программы, содержащий разделы: PREDICATES (описание предиката родитель), CLAUSES (перечисляются имеющиеся факты) и GOAL (запрос). рис.2. Рабочее окно редактора DOMAINS имя=string PREDICATES nondeterm родитель(имя, имя) CLAUSES родитель(илья, марина). родитель(марина, ира). родитель(елена, иван). родитель(николай, ира). родитель(ольга, алексей). родитель(марина, саша). родитель(сергей, иван). GOAL родитель(марина, саша) . Запустите и протестируйте программу с помощью команды Project | Test Goal (можно использовать кнопку на панели инструментов рис3. Окно вывода результата Указание: перед следующим запуском программы следует закрыть это окно. 2. Для ответа на вопрос: верно ли, что Алексей является родителем Ольги, измените запрос: GOAL родитель(алексей, ольга). После запуска программы (Project | Test Goal) будет получен ответ: no 3. Для ответа на вопрос: кто является ребенком Николая, запишите цель: GOAL родитель(николай, X) . Результат: X=ира 1 Solution 4. Для ответа на вопрос: кто родители Ивана, укажите запрос: GOAL родитель(X, иван), родитель(Y, иван), X<>Y. Результат: X=елена, Y=сергей X=сергей, Y=елена 2 Solutions 5. Для определения всех родителей и их детей, запишите: GOAL родитель(X, Y). Результат: X=илья, Y=марина X=марина, Y=ира X=елена, Y=иван X=николай, Y=ира X=ольга, Y=алексей X=марина, Y=саша X=сергей, Y=иван 7 Solutions Пример 2 Имеются факты вида: родитель(имя, имя) и женщина(имя). а) составить правило мать и определить, кто мать Маши. Решение: DOMAINS имя=string PREDICATES родитель(имя, имя) женщина(имя) мать(имя,имя) CLAUSES родитель("Марина","Ирина"). родитель("Елена", "Анна"). родитель("Ольга","Марина"). родитель("Ольга","Татьяна"). родитель("Татьяна","Катя"). родитель("Анна", "Маша"). женщина("Ольга"). женщина("Маша"). женщина("Ирина"). женщина("Елена"). женщина("Анна"). женщина("Марина"). женщина("Татьяна "). женщина("Катя"). мать(X,Y):-родитель(X,Y),женщина(X). GOAL мать(X,"Маша"). Результат: X=Анна 1 Solution b) составить правило бабушка и определить, кто бабушка Маши. Решение: DOMAINS имя=string PREDICATES nondeterm родитель(имя,имя) женщина(имя) nondeterm мать(имя,имя) nondeterm бабушка(имя,имя) CLAUSES родитель("Марина","Ирина"). родитель ("Елена", "Анна"). родитель("Ольга","Марина"). родитель("Ольга","Татьяна"). родитель("Татьяна","Катя"). родитель ("Анна", "Маша"). женщина("Ольга"). женщина( "Маша"). женщина("Ирина"). женщина("Елена"). женщина("Анна"). женщина("Марина"). женщина("Татьяна "). женщина("Катя"). мать(X,Y):-родитель(X,Y),женщина(X). бабушка(X,Z):-мать(X,Y),родитель(Y,Z). GOAL бабушка(X,"Маша"). Результат: X=Елена 1 Solution Замечание: ключевое слово nondeterm определяет недетерминированные предикаты, которые могут совершать откат назад и генерировать множественные решения. Таким образом, если задача предполагает возможность получения несколько решений, следует объявлять предикаты как недетерминированные. c) составить правило внучка и определить, сколько внучек у Ольги и как их зовут. Решение: DOMAINS имя=string PREDICATES nondeterm родитель(имя,имя) женщина(имя) nondeterm мать(имя,имя) nondeterm бабушка(имя,имя) nondeterm внучка(имя,имя) CLAUSES родитель("Марина","Ирина"). родитель ("Елена", "Анна"). родитель("Ольга","Марина"). родитель("Ольга","Татьяна"). родитель("Татьяна","Катя"). родитель("Анна", "Маша"). женщина("Ольга"). женщина( "Маша"). женщина("Ирина"). женщина("Елена"). женщина("Анна"). женщина("Марина"). женщина("Татьяна "). женщина("Катя"). мать(X,Y):-родитель(X,Y),женщина(X). бабушка(X,Z):-мать(X,Y),родитель(Y,Z). внучка(X,Y):-бабушка(Y,X),женщина(X). GOAL внучка(X, "Ольга"). Результат: X=Ирина X=Катя 2 Solutions ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ 1. Имеется база данных, содержащая следующие факты: любит(“Aнна,” яблоки). любит(“Сергей”, бананы). любит(“Андрей”, яблоки). любит(“Света”, шоколад). любит(“Вова”, шоколад). любит(“Анна”, шоколад). любит(“Света”, апельсины). любит(“Вова”, бананы). Составить программу, определяющую: всех, кто любит бананы; кто любит и шоколад, и яблоки; что любит Вова; что любят и Света, и Вова. 2. Имеется база данных, содержащая следующие факты: играет (“Саша”, футбол). играет (“Катя”, теннис). играет (“Саша”, теннис). играет (“Андрей”, футбол). играет (“Олег”, футбол). играет (“Ольга”, теннис). играет (“Катя”, волейбол). играет (“Олег”, волейбол). Составить программу, определяющую: каким видом спорта увлекается Андрей; всех, кто играет в волейбол; каким видом спорта увлекаются и Ольга, и Саша; кто увлекается и футболом, и волейболом. 3. Имеется база данных, содержащая следующие факты: любит(“Aнна,” яблоки). любит(“Сергей”, бананы). любит(“Андрей”, яблоки). любит(“Света”, шоколад). любит(“Вова”, шоколад). любит(“Анна”, шоколад). любит(“Света”, апельсины). любит(“Вова”, бананы). фрукты(яблоки ). фрукты(бананы). фрукты(апельсины ). конфеты(шоколад). используя имеющиеся факты, составить новое правило люб_фрукты(Х) и определить всех, кто любит фрукты; используя имеющиеся факты, составить новое правило люб_конфеты(Х) и определить всех, кто любит конфеты; используя имеющиеся факты, составить правило люб_вкусное(Х) и определить всех, кто любит и фрукты, и конфеты. 4. Имеется база данных, содержащая следующие факты: играет (“Саша”, футбол). играет (“Катя”, теннис). играет (“Саша”, теннис). играет (“Андрей”, футбол). играет (“Олег”, футбол). играет (“Ольга”, теннис). играет (“Катя”, волейбол). играет (“Олег”, волейбол). женщина(“Катя”). женщина(“Ольга”). мужчина(“Саша”). мужчина(“Андрей”). мужчина(“Олег”). используя имеющиеся факты, составить новое правило волейбол_жен(Х) и определить всех женщин, играющих в волейбол; используя имеющиеся факты, составить новое правило футбол_муж(Х) и определить всех мужчин, играющих в футбол; используя имеющиеся факты, составить правило теннис_пара(Х,Y), позволяющее найти смешанную теннисную пару (мужчина+женщина). Определить все такие пары. Отчет о выполненной самостоятельной работе должен содержать: тему лабораторной работы; условие задачи; листинг программы; результаты ее тестирования. 1.3 Создание простейших проектов Создание проекта позволяет протестировать пример как автономную исполняемую программу. После запуска проекта на исполнение создается exe-файл, работа которого завершается после первого решения, удовлетворяющего решению задачи. Запуск программы в этом режиме не обеспечивает автоматический вывод значений переменных, поэтому необходимо использовать стандартный предикат вывода write. Пример. Заданы отношения-факты: родитель(“Иван”,”Катя”). родитель(“Анна”,” Олег ”). родитель(“Олег”,”Дима”). родитель(“Игорь”,”Ольга”). родитель(“Олег”,”Виктор”). родитель(“Игорь”,”Иван”). мужчина(“Дима”). мужчина(“Иван”). мужчина(“Игорь”). мужчина(“Олег”). мужчина(“Виктор”). женщина(“Катя”). женщина(“Ольга”). женщина(“Анна”). Составить новое отношение-правило дед(X,Y) и определить, кто является дедушкой Кати. Создать проект и протестировать пример как автономную исполняемую программу. Решение 1. Запустите среду Visual Prolog и создайте новый проект (Project | New Project), активизируется окно Target'>Application_Expert'>Application Expert (эксперт приложения). 2. Определите имя проекта (Primer) и базовый каталог, куда будет сохранен проект (например, D:\VP\Primer) рис.4. Окно Application Expert На вкладке Target установите параметры и нажмите кнопку Create для создания проекта (рис. 5): р ис.5. Установки на вкладке Target окна Application Expert 3. Откройте окно Compiler Options (Options | Project | Compiler Options), откройте вкладку Warnings и установите опции компилятора для созданного проекта (рис.6): рис.6. Установки опций компилятора Нажмите OK. 4. В окне проекта выделите файл Primer.pro и откройте его для редактирования (двойной щелчок или кнопка Edit) рис.7. Окно проекта Файл с расширением .pro содержит секции PREDICATES, GOAL, CLAUSES. Допишите необходимые определения так, чтобы получилась программа: DOMAINS имя=string PREDICATES родитель(имя,имя) женщина(имя) мужчина(имя) дед(имя, имя) CLAUSES родитель("Иван","Катя"). родитель("Анна","Олег"). родитель("Олег","Дима"). родитель("Игорь","Ольга"). родитель("Олег","Виктор"). родитель("Игорь","Иван"). мужчина("Дима"). мужчина("Иван"). мужчина("Игорь"). мужчина("Олег"). мужчина("Виктор"). женщина("Катя"). женщина("Ольга"). женщина("Анна"). дед(X,Z):-родитель(X,Y), родитель(Y,Z), мужчина(X). GOAL дед(X,"Катя"),write(X). 5. Откомпилируйте исходный код примера и запустите его как автономную исполняемую программу. ( Project | Run, или клавиша рис.8. Окно вывода результата |