Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Clauses



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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...