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

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

С заданными отношениями:

hiker(HN, Name), mountain(MN, Height), climbed(HN, MN, Date). 

В.: Дайте безопасные правила журнала данных (с отрицанием, если необходимо) для следующих запросов:

(a) Найдите имена туристов, которые поднялись на горы с Height > 5000m.

Я написал так

hiker(Name): - moutain(MN, Height), climbed(HN, MN, Date), Height > 5000

Но если мне нужно найти имена туристов, которые поднялись на каждую гору высотой > 5000 м, мне будет трудно понять разницу между некоторыми и каждыми в этих двух вопросах.

Пожалуйста, помогите мне.


person Katie    schedule 25.09.2016    source источник


Ответы (2)


Вопрос «некоторые» легко выразить с помощью таких языков, как Datalog и SQL, потому что вам нужно найти только одну гору для каждого туриста. Неважно, прошел ли турист одну, две или более гор. Правила регистрации данных идеально подходят для этого.

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, _),
  ...
person Martin Bravenboer    schedule 25.09.2016
comment
mbravenboer: будет ли это так:- результат(H) :- hiker(H,_), ! some_not_climbed(H) ? - person Katie; 26.09.2016
comment
Да, извините, если было слишком просто ;). - person Martin Bravenboer; 26.09.2016
comment
Здравствуйте, Мартин, у меня был еще один вопрос ... было бы здорово, если бы вы помогли мне. 3 отношения ( край (X, Y), красный (X, Y), синий (X, Y) ) считаются графом, отношения которого может быть окрашен в красный/синий цвет. а) найти пары узлов X и Y, в которых есть путь (последовательность связанных ребер) из X в Y ? Согласно мне, я думаю, что ответ должен быть путем (X, Y): - край (X, Z), край (Z, Y), это правильно? б) Найдите пары узлов X и Y, в которых существует путь (последовательность связанных ребер) четной длины от X до Y с чередованием красного и синего цветов. Как я могу изменить ответ на первую часть, чтобы получить ответ на вторую часть? - person Katie; 27.09.2016
comment
См. мой комментарий к отдельному вопросу SO, который вы создали для этого. - person Martin Bravenboer; 28.09.2016
comment
@MartinBravenboer, какую реализацию журнала данных вы используете? Мой задыхается от предоставленного кода. Например, он кажется недовольным высотой › 5000 в high_mountain/1. - person paxos1977; 13.03.2017

Допустим, у нас есть 3 горы, высота которых больше 5000 (названия: М1, М2, М3).

Путешественник с именем X поднялся на 5 гор (M1, M20, M30, M40, M50), и только одна из них имеет высоту более 5000 м (M1).
Это имя туриста должно появиться в вашем список для первого вопроса, потому что он поднялся на «некоторые» горы > 5000.

Однако этот турист НЕ прошел все горы выше 5000 (он не поднимался на М2 и М3), поэтому его имя не должно фигурировать во втором списке.

person Sparrow    schedule 25.09.2016
comment
Спасибо. Я понял вашу мысль. я сомневаюсь, как мы запишем это в правила журнала данных в соответствии с рассматриваемым отношением. Скажем, для имен, которые прошли все горы с высотой › 5000, я записал в журнал данных так: турист (Имя): - гора (MN, Высота), поднялся (HN, MN, Дата), Высота › 5000. Правильно ли это и как будет ли иначе в случае с некоторыми горами высотой >5000? - person Katie; 25.09.2016