Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IIS / Лекции / ЛР 2 3 - Prolog задание 2.doc
Скачиваний:
42
Добавлен:
31.03.2015
Размер:
92.16 Кб
Скачать
    1. Составные запросы

Составные запросы образуются из простых, соединенных между собой запятыми. Каждый простой запрос называется подцелью. Для того, чтобы составной запрос оказался истинным, необходимо, чтобы каждая из его подцелей была бы истинной. Введем составной запрос, который будет соответствовать вопросу: "Есть ли такой отдел, где вместе работают Петров и Сидоров?"

Goal: work("Петров",X),work("Сидоров",X) Х=101 1 Goal:

Переменная Х входит в обе подцели, т.е. для истинности всего запроса требуется, чтобы вторые аргументы в каждой из подцелей принимали одни и те же значения.

Использование констант в аргументах запроса эквивалентно заданию входных параметров программы. Использование переменных - эквивалентно требованию получить от программы выходные данные.

    1. Запросы с анонимными переменными

Символ подчеркивания (_) выступает в качестве анонимной переменной, которая предписывает системе проигнорировать значение аргумента. Эта переменная унифицируется с чем угодно, но не обеспечивает выдачу на экран данных. Каждая анонимная переменная, входящая в запрос, отличается от других переменных этого запроса.

Посмотрим, что будет, если ввести запрос work(Worker,_). При выполнении этого запроса будут выданы все возможные значения первого аргумента предиката work(...), вне зависимости от того, какие значения будет принимать второй аргумент. Таким образом данный запрос соответствует вопросу:

"Существует ли хотя бы один служащий, который работает в каком-либо из отделов?". Сформированный к программе запрос аналогичен желанию получить данные о всех служащих, работающих во всех отделах фирмы.

Goal: work(Worker,_) Worker="Петров" Worker="Павлов" Worker="Сидоров" 3 Goal:

  1. Статические и динамические базы данных

 Как уже отмечалось, множество фактов Пролог-программы можно рассматривать как базы данных, к которой могут формулироваться любые произвольные запросы. Однако, данные такой БД жестко связаны с самой Пролог-программой. Любое манипулирование с БД требует изменения или добавления того или иного факта в текст программы. В связи с этим такие базы данных называют статическими БД.

Так, для ввода информации о поступлении на службу в 101 отдел Иванова, нам потребуется войти в режим редактирования программы и добавить новый факт.

/* Программа 4 */

. . . .

clauses

. . . . work( "Петров" , 101 ). Goal: work(Worker,_)

Worker="Петров" Worker="Павлов" Worker="Сидоров" Worker="Иванов" 4

Goal:

Если затем в режиме выполнения мы зададим запрос о сотрудниках всех отделов, то получим информацию уже о четырех служащих. Причем обратите внимание, что в ответе на запрос данные об Иванове будут выводиться в той, по номеру, строке, каким по счету в программе является факт о работе Иванова в 101 отделе.

Попробуйте, войдя в режим редактирования, переставить факты местами. Затем, войдя в режим выполнения, сформулировать запрос к базе. Заметьте, что система находит ответы в БД в том порядке, как они введены в программе. 5h'o еще одна особенность работы со статическими БД.

Динамические базы данных - это БД, в которых факты могут модифицироваться во время выполнения программы или выбираться из файла. Для работы с такими БД в тексте программы в секции database должны быть декларированы предикаты для описания структуры динамической БД. Работа с такими БД будет описана ниже.