Лабораторная работа№7 «Составные объекты» Тема: составные объекты.
Цель работы: изучить виды объектов, правила использования.
Простые и составные объекты
До сих пор мы рассмотрели только несколько видов объектов данных Visual Prolog, таких как числа, идентификаторы и строки. В этой главе мы обсудим все типы объектов данных, которые Visual Prolog может создавать, от простых до составных.
Простые объекты данных
Простой объект данных — это переменная или константа. Не путайте это значение слова "константа" с символьными константами, которые вы определяете в разделе constants программы. То, что мы здесь называем константой, это нечто, идентифицирующее объект, который нельзя изменять: символ (char), число (integer или real) или атом (symbol ИЛИ string).
Символыимеют тип char. Печатные символы (ASCII 32—127) — это цифры (0—9), прописные буквы A—Z, строчные буквы a—z, символы пунктуации и специальные символы. Литеры вне этого диапазона могут быть непереносимыми с одной платформы на другую; в особенности, литеры, меньшие ASCII 32 (пробел) и управляющие символы, традиционно используемые терминалами и связующим оборудованием.
Числамогут быть целыми (integer) или вещественными (real). Вещественные хранятся в стандартном формате IEEE и имеют значения от 1е-308 до 1еЗО8 (от 10308 до 10+308). Примеры целых и вещественных чисел приведены в табл. 12.2.
Атомыимеют тип идентификатор (symbol) или строка (string). Отличие между ними — главным образом вопрос машинного представления и реализации, и, в основном, оно синтаксически не заметно. Когда атом передается в качестве аргумента при вызове предиката, то к какому домену принадлежит атом — symbol или string — определяется по тому, как описан этот аргумент в декларации предиката.
Visual Prolog автоматически преобразует типы между доменами string и symbol, поэтому вы можете использовать атомы symbol в доменах string и наоборот. Однако принято считать, что объект в двойных кавычках принадлежит домену string, а объект, не нуждающийся в кавычках, домену symbol. Атомытипа symbol — это имена, начинающиеся со строчной буквы и содержащие только буквы, цифры и знак подчеркивания.
Составные объекты данных и функторы
Составные объекты данныхпозволяют интерпретировать некоторые части информации как единое целое таким образом, чтобы затем можно было легко разделить их вновь. Возьмем, например, дату "октябрь 15, 1991". Она состоит из трех частей информации — месяц, день и год. Представим ее на рис. 8, как древовидную структуру.
Рис. 8. Древовидная структура даты
Вы можете сделать это, объявив домен, содержащий составной объект date:
domains
date_cmp = date(string, unsigned, unsigned)
а затем просто записать:
D = date("October",15,1991).
Такая запись выглядит как факт Пролога, но это не так — это объект данных, который вы можете обрабатывать наряду с символами и числами. Он начинается с имени, называемого функтором (в данном случае date), за которым следуют три аргумента.
Обратите внимание, что функтор в Visual Prolog — не то же самое, что функция в других языках программирования; это просто имя, которое определяет вид составного объекта данных и объединяет вместе его аргументы.
Функтор не обозначает, что будут выполнены какие-либо вычисления.
Аргументы составного объекта данных могут сами быть составными объектами.
Унификация составных объектов
Составной объект может быть унифицирован с простой переменной или с составным объектом (возможно, содержащим переменные в качестве частей во внутренней структуре), который ему соответствует. Это означает, что составной объект можно использовать для того, чтобы передавать целый набор значений как единый объект, и затем применять унификацию для их разделения. Например:
date("April",14,1960)
сопоставляется с х и присваивает х значение date ("April", 14, i960). Также
date("April",14, I960)
сопоставляется с date(Mo, Da, Yr) и присваивает переменным Mo = "April", Da = 14 И Yr = I960.
Visual Prolog осуществляет унификацию в двух случаях. Во-первых, когда цель сопоставляется с заголовком предложений. Во-вторых, через знак равенства (=), который является инфиксным предикатом (предикатом, который расположен между своими аргументами, а не перед ними).
Фактически, Visual Prolog выполняет операцию присваивания для унификации объектов по разные стороны знака равенства. Это свойство полезно для нахождения значений аргументов составного объекта
Составные объекты могут рассматриваться в предложениях Пролога как единые объекты,
Можно использовать первый компонент составного объекта — функтор для распознавания различных объектов.
Важная особенность составных объектов состоит в том, что они позволяют легко передавать группы величин, как один аргумент. Рассмотрим в качестве примера ведение телефонной базы данных. Объявление составных доменов
После компиляции программы, которая содержит следующие отношения:
domains
название,автор = symbol
год_издания,колич_стр = integer
персона=персона(имя_персоны,адрес_персоны)
имя_персоны=имя_персоны(имя,фамилия)
адрес_персоны=адрес_персоны(дом,улица,город)
выбранная_книга=выбранная_книга(состояние,название_книги)
дом=integer
состояние,название_книги,имя,фамилия,улица,город=symbol
predicates
книга(название, автор, год_издания,колич_стр)
предпочтение(имя,фамилия, название)
запись_в_карточке(персона,выбранная_книга)
clauses
книга(«Зарядка для хвоста», «Григории Остер»,1993,86).
книга(«Новая пародия», «Александра Хаут»,1993,72).
книга(«Верхний этаж», «Александр Власов»,1983,147).
книга(«Вини пух», «Аскандер Милн»,1992,201).
книга(«Сказка», «Джонни Радарри»,1992,206).
книга(«Нерв», «Владимир Высоцкий»,1990,206).
предпочтение(«Павел», «Павлов»,«Зарядка для хвоста»).
предпочтение(«Олег», «Сидоров», «Новая пародия»).
предпочтение(«Павел», «Павлов», «Сказка»).
предпочтение(«Олег», «Сидоров», «Новая пародия»).
предпочтение(«Ольга», «Тараканова»,«Зарядка для хвоста»).
запись_в_карточке(персона(имя_персоны(«Павел», «Павлов»,),адрес_персоны(16, «Жилина», «Тольятти»)), выбранная_книга(старая, «Новая пародия»)).
запись_в_карточке(персона(имя_персоны(«Олег», «Сидоров»),адрес_персоны(25, «Мира», «Самара»)), выбранная_книга(новая, «Верхний этаж»)).
запись_в_карточке(персона(имя_персоны(«Ольга», «Тараканова»),адрес_персоны(54, «Мира», «Самара»)), выбранная_книга(новая, «Верхний этаж»)).
goal
запись_в_карточке(персона(имя_персоны(Имя_персоны,Фамилия_персоны),адрес_персоны(_,_,A)), выбранная_книга(«Верхний этаж»,_)),A<>"Тольятти".
V isual Prolog позволяет конструировать составные объекты на нескольких уровнях (рис 9).
Рис. 9. Древовидная структура «запись_в_карточке» Задание
Задача: создать программу Домашние животные с использованием составных объектов. Создание программы
Создать программу:
domains
person=person (p_name,address) % функтор персона состоит из функтора
имя персоны и функтора адрес персоны
p_name=p_name (name, fameli) % функтор имя персоны состоит из
объектов имени и фамилии
address =address (hous,street,sity) % функтор адрес персоны состоит из
объектов дом,улица, город
animal=animal(vid,a_name) % функтор животные состоит из объектов вид
животного, кличка животного
hous=integer % домен дом – числовой
vid,a_name,name,fameli,street,sity=symbol % домены вид животного,
кличка животного, имя персоны, фамилия
персоны, улица, город – символьные
predicates
owns(person,animal) % описание составного объекта персона имеет
животного (состоит из функторов
персона и животное)
clauses
owns(person(p_name(oleg,petrov),address(12,mira,toliatti)),animal(horse,leo)).
owns(person(p_name(oleg,petrov),address(12,mira,toliatti)),animal(dog,dik)).
owns(person(p_name(liza,rizova),address(15,matrosova,toliatti)),animal(dog,bim)).
owns(person(p_name(olga,ivanova),address(46,mira,toliatti)),animal(cat,vacia)).
owns(person(p_name(sergei,orlova),address(16,sovetskai,toliatti)),animal(dog,mili)).
owns(person(p_name(pasha,nikolaev),address(55,matrosova,toliatti)),animal(dac,kra)).
goal
owns(person(p_name(Name_person,Famili_person),address(_,_,_)),animal(dog,Name_dog)). % показать всех хозяев собак и клички собак
Получим результат:
Name_person=oleg, Famili_person=petrov, Name_dog=dik
Name_person=liza, Famili_person=rizova, Name_dog=bim
Name_person=sergei, Famili_person=orlova, Name_dog=mili
3 Solutions В данной программе использовались многоуровневые составные объекты. На рисунке 10 представлено дерево многоуровневого составного объекта owns.
Рисунок 10 - Дерево многоуровневого составного объекта owns Добавим в программу выражение: персонам нравятся те виды животных, которые они содержат.
like(Name,Fameli,Vid):-owns (person (p_name (Name,Fameli), address(_,_,_)), animal(Vid,_)).
Определить какие животные нравятся Олегу Петрову, если ему нравятся те же животные что и Ольге Ивановой. Показать всех персон содержащих лошадей, проживающих не в городе Тольятти. Добавить в функтор персона составной объект дата рождения, дерево составного объекта дата рождения представлено на рисунке 11.
Рисунок 11 - Дерево составного объекта birthday
Показать всех персон именинников в мае месяце на содержащих кошек. Организовать 2-3 запроса с составной целью.
Вопросы для самоконтроля
Перечислите и опишите виды объектов в Visual Prolog. Дайте определение простому объекту данных. Перечислите простые виды объектов в Visual Prolog. Дайте определение составному объекту данных. Дайте определение функтору.
Лабораторная работа№8 «Списки» Тема: работа со списками.
Цель работы: изучить основные принципы работы со списками в Visual Prolog.
Списки
Предположим, вы хотите заполнить расписание занятий по различным предметам, которые могут проводить разные преподаватели. Вы можете написать следующую программу:
predicates
teacher(symbol First_name, symbol Last_name, symbol Class) % учитель (имя,
фамилия, класс)
clauses
teacher(ed, willis, englishl). teacher(ed, willis, mathl). teacherfed, willis, historyl). teacher(тагу, maker, history2). teacher(тагу, maker, math2). teacher(chris, grahm, geometry).
Здесь повторяется имя учителя для каждого предмета, который он или она ведет. Для каждого предмета приходится добавлять факт к базе данных. Хотя это и совершенно правильно в такой ситуации, но можно найти школу, где преподают сотни предметов; такой тип данных становится слишком сложным. Здесь было бы удобно создать аргумент для предиката, который содержит одно или несколько значений.
Список в Прологе предлагает упростить решение данной задачи. В следующей программе аргумент class (класс) имеет тип "список". Мы покажем здесь, как список представляется в Прологе, а предикаты, работающие со списками.
domains
classes = symbol* % объявляем домен-список
predicates
teacher(symbol First, symbol Last, classes Classes) %( имя, фамилия, предметы)
clauses
teacher(ed, willis, [englishl, mathl, historyl]). teacher(тагу, maker, [history2, math2]). teacher(chris, grahm, [geometry]).
В этом примере текст программы более краток и понятен, чем в предыдущем. Обратите внимание на определение домена:
domains
classes = symbol*
Звездочка (*) обозначает, что classes — это список идентификаторов. Так же просто можно объявить список целых:
domains
integer_list = integer*
После того, как домен определен, его очень просто использовать; поместите его в качестве аргумента в предикат в разделе predicates. Ниже приведен пример использования списка целых:
domains
integer_list = integer*
predicates
test_scores(symbol First, symbol Last, integer_list Test_Scores) /* список_результатов (имя, фамилия, список_результатов */
clauses
test_scores(lisa, lavender, [86, 91, 75]).
test_scores(libby, dazzner, [79, 75]).
test_scores(jeff, zheutlin, []).
В случае Jeff zheutlin обратите внимание, что список может вообще не иметь элементов.
Задание
Используя списки написать программу нахождения выхода из лабиринта (из точки Х в точку Y)(рис. 12).
Рис. 12. Лабиринт Вопросы для самоконтроля
Перечислите какого типа задачи позволяют решить списки в Visual Prolog. Укажите как задается список в Visual Prolog.
Используемая литература А.И. Башмаков, И.А. Башмаков Интеллектуальные информационные технологии.: Учебн. пособие. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2005 А.В. Андрейченков, О.Н. Андрейченкова Интеллектуальные информационные системы: Учебник. – М.: Финансы и статистика, 2004 П.А. Шрайнер Основы программирования на языке Пролог: курс лекций: учеб. пособие для студентов вузов, обучающих ся по специальностям в обл. информ. технологий. – М.: Интернет – Ун-т Информ. Технологий, 2005 Т.А. Гаврилова, В.Ф. Хорошевский Базы знаний интеллектуальных систем. Учебник. - Вильямс, 2000 Люгер Дж.Ф. Искусственный интеллект: стратегия и методы решений сложных проблем. 4 изд. Вильямс. 2003 Гаврилова Т.А., Червинская К.Р. Извлечение и структурирование знаний для экспертных систем.- М.: Радио и связь, 1992 г. Пупков К.А.Интеллектуальные системы. Исследование и создание.-М.:МГТУ им.Н.В.Баумана,2004. Матвеев Л.А. Информационные системы: поддержка принятия решений. – СПб.:Изд-во СПбУЭФ, 1996 г. Адаменко А.Н., Кучуков А.М. Логическое программирование и Visual Prolog. СПб.:БХВ- Петербург, 2003 Информатика. Учебник. – 3-е перераб.изд. /Под ред. проф. Н.В.Макаровой.-М.: Финансы и статистика, 2001. Аверкин А.Н., Батыршин И.З., Блишун А.Ф., Силов В.Б., Тарасов В.Б., Нечеткие множества в моделях управления и искусственного интеллекта// Под ред. Д.А. Доспелова. М.:Наука, 1986. Вейтгеймер М., Продуктивное мышление // Пер. с нем. М:Прогресс, 1987. Ларичев О.И., Мечитов А.И., Могикович Е.И., Фурумс Е.М. Выявление знаний экспертных задач. М: Наука, 1989. Минский М. Фреймы для предоставления знаний. М: Энергия, 1979. Осипов Г.С. Приобретение знаний интеллектуальными системами. М.: Наука, 1997. Попов Э.В. Общение с ЭВМ на естественном языке. М.: Наука, 1982. Хант Д. Искусственный интеллект. М.:Мир, 1986. Эндрю А. Искусственный интеллект. М.:Мир, 1985. Адаменко А.Н., Кучков А.М. Логическое программирование и Visual Prolog. – СПб.: БХВ-Питербург, 2003.
|