1

我需要以下查询的帮助:

与给定的关系:

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

Q.:为以下查询提供安全的 Datalog 规则(必要时可取反):

(a) 找出用Height > 5000m.

我是这样写的

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

但是,如果我必须找到爬过每座高度 > 5000m 的山的徒步旅行者的名字,我很难理解这两个问题中someevery之间的区别。

请指导我。

4

2 回答 2

1

“一些”问题很容易用 Datalog 和 SQL 等语言表达,因为您只需为每个徒步旅行者找到一座山。远足者是否徒步过一座、两座或更多座山并不重要。数据记录规则非常适合这一点。

result(Name) :-
  hiker(H, Name),
  climbed(H, M, _),
  mountain(M, Height), Height > 5000.

“每个”问题都更难回答,因为您现在需要确认徒步旅行者已经爬过每一座山,而不仅仅是其中一座。

假设一个封闭的世界数据库,“每个”问题都可以翻译成双重否定,这很容易表达。您需要搜索没有超过 5000m 的山峰且他们没有爬过的徒步旅行者。

我将在此查询的第一部分为您提供一些帮助,然后您可能会找到答案。

// 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, _),
  ...
于 2016-09-25T22:07:30.160 回答
0

假设我们有 3 座山,它们的高度大于 5000(名称:M1、M2、M3)。

一位名叫X的徒步旅行者已经爬过 5 座山(M1、M20、M30、M40、M50),其中只有一座山的高度超过 5000 (M1)。
这个徒步旅行者的名字应该出现在第一个问题的列表中,因为他已经攀登了“一些”山 > 5000。

但是,这个徒步旅行者没有爬过所有高于 5000 的山(他没有爬过 M2 和 M3),所以他的名字不应该出现在第二个列表中。

于 2016-09-25T03:21:49.863 回答