Ограничения вида один-к-многим

Если бинарное отношение с аргументами Х и Y регулируется ограничением вида один-к-многим, обеспечивающим целостность этого отношения, то это означает, что для заданного значения Х может существовать много значений Y, удовлетворяющих этому отношению, но для заданного значения Y существует только одно значение X, которое удовлетворяет отношению.

Примером отношения, регулируемого ограничением вида один-к-многим, может служить процедура "отец". У отца может быть несколько детей, но никак не наоборот.

% один много

отец (билл, даниэль).

отец (билл, кеннет).

отец (джеффри, билл).

Ограничения вида многие-к-одному

Если бинарное отношение с аргументами Х и Y регулируется ограничением вида многие-к-одному, обеспечивающим целостность этого отношения, то это означает, что для заданного значения Х существует только одно значение Y, удовлетворяющее данному отношению, но для заданного значения Y может существовать много значений X, которые удовлетворяют отношению.

Примером отношения, регулируемого ограничением вида многие-к-одному, служит процедура "уроженец". В какой-либо стране может родиться много, людей, но один человек может быть уроженцем только одной страны.

% много один

уроженец (джереми, америка).

уроженец (нэнси, америка).

уроженец (рауль, Франция).

Ограничения вида многие-к-многим

Если бинарное отношение с аргументами Х и Y регулируется ограничением вида многие-к-многим, обеспечивающим целостность этого отношения, то для заданного значения Х может существовать много значений Y, Удовлетворяющих этому отношению, а для заданного значения Y может существовать много значений X, которые удовлетворяют этому отношению.

Можно привести пример базы данных, предназначенной для типографской компании. В этой базе данных содержатся сведения о сортах бумаги. Первый аргумент соответствует цвету бумаги, а второй — ее виду. Разрешена любая комбинация цвета и вида бумаги.

% цвет вид бумаги

бумага (красный, плотная).

бумага (белый, глянцевая).

бумага (кремовый, плотная).

бумага (белый, гладкая).

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

Симметрия

Отношение между двумя сущностями будет симметричным, если роли, которые играют эти сущности, взаимозаменимы. Если предикат языка Пролог обладает свойством симметрии, то порядок следования аргументов в запросе к этому предикату не будет иметь значения.

Примером симметричного отношения может служить отношение "брат_или_сестра". Если известно, что Джейн - это сестра Элис, то будет верным и тот факт, что Элис является сестрой Джейн. Рассмотрим, однако, пример простой базы данных языка Пролог, состоящей из фактов "брат_или_сестра":

брат_или_сестра (джейн, элис).

брат_или_сестра (кэти, дорога).

Если написать запрос к этой базе данных, в котором аргументы располагаются в том же порядке, как и у фактов, входящих в эту базу, то запрос будет успешным:

|? - брат_или_сестра (джейн, элис).

да

Но если поменять аргументы местами, то запрос потерпит неудачу:

|? -брат_или_сестра (элис, джейн).

нет

Отрицательный ответ на запрос свидетельствует о том, что приведенная здесь реализация отношения "брат_или_сестра" несимметрична.

Определение симметричного отношения

Одним из способов придания симметрии предикату "брат—или—сестра" может служить составление двух правил, ссылающихся на явную базу данных. Явная база данных носит название "братсест". Она содержит все сведения о Джейн, Элис, Кэти и Дороги:

братсест (джейн, злис).

братсест (кэти, дороги).

брат_или_сестра2 (А, Б): - братсест (А, Б). % (1)

брат_или_сестра2 (А, Б): - братсест (Б, А). % (2)

Правило (1) предиката "брат_или_сестра2" передает аргументы А и Б подцели "братсест" в том же порядке, как они заданы в заголовке правила. Правило (2) меняет порядок следования аргументов. Запрос:

|? - брат_или_сестра2 (джейн, элис).

да

решается в соответствии с правилом (1), а тот же самый запрос с обратным порядком следования аргументов:

|? - брат_или_сестра2 (элис, джейн).

да

решается в соответствии с правилом (2). Таким образом, предикат "брат_или_сестра2" ведет себя как симметричное отношение. Как Вы считаете, какая совокупность ответов будет получена в результате нижеследующего запроса?

|? - брат_или_сестра2 (X, Y).

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие