首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据查询

数据查询
EN

Stack Overflow用户
提问于 2016-09-25 01:49:12
回答 2查看 997关注 0票数 1

我需要一些关于以下查询的帮助:

与特定的关系:

代码语言:javascript
复制
hiker(HN, Name), mountain(MN, Height), climbed(HN, MN, Date). 

Q.:为下列查询提供安全的数据模拟规则(必要时为否定):

(a)找出用Height > 5000m爬山的徒步旅行者的名字。

我是这样写的

代码语言:javascript
复制
hiker(Name): - moutain(MN, Height), climbed(HN, MN, Date), Height > 5000

但是,如果我必须找到每座海拔超过5000米的山的徒步旅行者的名字,我就很难理解这两个问题中的某些人和每一个人之间的区别。

请引导我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-25 22:07:30

这个“一些”问题很容易用Datalog和SQL这样的语言表达,因为你只需要找到每个徒步旅行者一座山。徒步旅行者是否曾远足过一座、两座或更多的山并不重要。对于这一点,Datalog规则是完美的。

代码语言:javascript
复制
result(Name) :-
  hiker(H, Name),
  climbed(H, M, _),
  mountain(M, Height), Height > 5000.

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

假设一个封闭的世界数据库,“每一个”问题可以被翻译成双重否定,这是很容易表达的。你需要寻找那些没有攀登过的超过5000米的山的徒步旅行者。

我将帮助您完成这个查询的第一部分,然后您可能会找到答案。

代码语言:javascript
复制
// 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, _),
  ...
票数 1
EN

Stack Overflow用户

发布于 2016-09-25 03:21:49

假设我们有3座山,它们的高度大于5,000(名字: M1,M2,M3)。

一位名叫X的徒步旅行者已经攀登了5座山(M1,M20,M30,M40,M50),其中只有一座山的高度超过了5000 (M1)。

这个徒步旅行者的名字应该出现在你的第一个问题的名单上,因为他已经爬了5000多座山。

然而,这位远足者没有爬过所有5000以上的山(他没有爬过M2和M3),所以他的名字不应该出现在第二份名单上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39682662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档