База данных для запроса

Мне нужна помощь по следующему запросу:

С учетом отношений:

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), поэтому его имя не должно появляться во втором списке.

Другие вопросы по тегам