База данных для запроса
Мне нужна помощь по следующему запросу:
С учетом отношений:
hiker(HN, Name), mountain(MN, Height), climbed(HN, MN, Date).
Q.: Приведите безопасные правила регистрации данных (с отрицанием при необходимости) для следующих запросов:
(а) Найдите имена путешественников, которые поднялись в горы с Height > 5000m
,
Я написал так
hiker(Name): - moutain(MN, Height), climbed(HN, MN, Date), Height > 5000
Но если мне нужно найти имена путешественников, которые взбирались на каждую гору с высоты> 5000 м, мне будет трудно понять разницу между некоторыми и каждым в этих двух вопросах.
Пожалуйста, ведите меня.
2 ответа
Вопрос "некоторые" легко выразить на языке, таком как Datalog и SQL, потому что вам нужно найти только одну гору на каждого туриста. Неважно, путешествовал ли турист одна, две или более гор. Правила Datalog идеально подходят для этого.
result(Name) :-
hiker(H, Name),
climbed(H, M, _),
mountain(M, Height), Height > 5000.
На "каждый" вопрос труднее ответить, потому что теперь вам нужно подтвердить, что путешественник поднялся на каждую гору, а не только на одну из них.
Предполагая базу данных закрытого мира, вопрос "каждый" может быть переведен в двойное отрицание, что легко выразить. Вам нужно искать путешественников, для которых не существует горы> 5000м, чтобы они не лазили.
Я немного помогу вам с первой частью этого запроса, и тогда вы, вероятно, сможете найти ответ.
// this is just for convenience
high_mountain(M) :-
mountain(M, Height),
Height > 5000.
// there exists a mountain hiker H has not climbed.
some_not_climbed(H) :-
hiker(H, _),
high_mountain(M),
!climbed(H, M).
// for hiker H there is no mountain that he has not climbed.
result(H) :-
hiker(H, _),
...
Допустим, у нас есть 3 горы, высота которых превышает 5000 (названия: M1, M2, M3).
Путешественник по имени X поднялся на 5 гор (M1, M20, M30, M40, M50), и только высота одной из этих гор превышает 5000 (M1).
Это имя путешественника должно появиться в вашем списке для первого вопроса, потому что он поднялся на "некоторые" горы> 5000.
Тем не менее, этот турист НЕ лазил по всем горам выше 5000 (он не поднимался по М2 и М3), поэтому его имя не должно появляться во втором списке.