Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
lecturer("Иванов").
lecturer("Семенов").
assistant("Петров").
assistant("Сидоров").
Обращение к логическим программам организовано с помощью вопросов (целей), формулируемых с использованием употребляемых в программе предикатов и, при необходимости, логических связок. Выйдите из редактора (через Escape), запустите программу (через Run) и наберите запросы:
Goal: lecturer("Петров").
Goal: lecturer("Иванов").
Goal: assistant("Петров").
Goal: assistant("Иванов").
Дайте объяснение полученным ответам.
Примечание: в Турбо-Прологе переменная - слово, начинающееся с заглавной буквы и могущее содержать лишь (латинские) буквы, цифры и подчерки; константа - такое же слово, начинающееся со строчной буквы или любая последовательность символов, заключенная в кавычки.
Если вместо конкретного объекта (в данной программе - фамилии-константы) в качестве аргумента предиката указана переменная, программа ищет все возможные варианты выполнения данного предиката. Убедитесь в этом, набрав запросы:
Goal: lecturer(Х).
Goal: assistant(Х).
Усложним нашу программу, дополнив раздел predicates предикатами:
subject(symbol,symbol)
worker(symbol,symbol)
Дополним также раздел clauses фактами, использующими введенные предикаты:
subject("Иванов","ИИС").
subject("Петров","ИИС").
subject("Сидоров","ДМ").
subject("Семенов","ДМ").
worker("Иванов","ОСУ").
worker("Петров","ОСУ").
worker("Сидоров","ПМ").
worker("Семенов","ПМ").
worker("Смирнов","ПМ").
worker("Федоров","ИДО").
Теперь мы можем построить более сложные запросы. Например, можно спросить, кто является лектором по дисциплине "ИИС" ("Интеллектуальные информационные системы") и на какой кафедре он работает:
Goal: subject(X,"ИИС"), lecturer(X), worker(X,Y).
Задание: сформулируйте и проверьте следующие запросы:
Кто работает на кафедре прикладной математики ("ПМ")?
Кто лектор из работающих на кафедре "ПМ" и какую дисциплину он читает?
Кто ассистент из преподающих дискретную математику ("ДМ")и где он работает?
Придумайте и проверьте собственные запросы.
Возврат
Лабораторная работа № 3а. Использование правил и статических баз данных.
До сих пор наша программа teachers.pro содержала различные факты, а всё, что нам было нужно извлечь из знания этих фактов, мы определяли, формулируя различные запросы. Введем в программу новую конструкцию, называемую правилом.
Правило обычно имеет вид: А:-В1,В2,…,Вn. Левая часть правила (А) называется заголовком и представляет собой атомарную формулу. Правая часть (В1,В2,…,Вn) называется телом правила и представляет собой множество (возможно пустое) подцелей, выполнение которых необходимо для выполнения А. Знак :- читается как "если". Значит, запись А:-В1,В2,…,Вn читается так: " А имеет место, если имеют место В1 и В2 и … и Вn ", т.е. запятая в записи правила играет роль логической связки "и" (вместо запятой можно также писать AND).
Дополним раздел predicates нашей программы еще парой предикатов:
teacher(symbol)
teacher_chair(symbol,symbol)
Кроме того, в раздел clauses введем три правила:
teacher(X):-lecturer(X).
teacher(X):-assistant(X).
teacher_chair(X,Y):-teacher(X),worker(X,Y).
Первые два правила вводят более общее понятие teacher (преподаватель), объединяя в нем и лектора, и ассистента, а третье правило, напротив, конкретизирует это обобщение до понятия teacher_chair (преподаватель_кафедры). Теперь с помощью запросов
teacher(X).
teacher_chair(X,Y).
teacher_chair(X,"ОСУ").
teacher_chair(X,"ПМ").
teacher_chair("Иванов",Y).
мы можем получить список всех преподавателей, списки преподавателей по всем и по каждой кафедре, выяснить, преподавателем какой кафедры является "Иванов".
В принципе, первые два правила, определяющие понятие teacher, можно свести в одно с помощью логической связки "или", обозначаемой в Турбо-Прологе с помощью точки с запятой (или словом OR). Таким образом, вместо приведенной выше тройки правил, можно использовать следующие два (убедитесь практически в их работоспособности):
teacher(X):-lecturer(X); assistant(X).
teacher_chair(X,Y):-teacher(X),worker(X,Y).
Но более прозрачным (относительно типов правил и их роли в базе знаний) и потому более надежным считается специалистами первый из использованных нами способов.
Наконец, все эти сведения мы можем свести в единую базу данных, использовав предикат staff (штат) с необходимым числом аргументов. Для удобства для разных аргументов этого предиката введем разные обозначения типов объектов, что потребует использования раздела domains. Таким образом, наша новая программа примет вид:
/* Программа staff.pro */
Дата публикования: 2015-10-09; Прочитано: 204 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!