【问题标题】:Datalog for query查询数据记录
【发布时间】:2016-09-25 01:49:12
【问题描述】:

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

与给定的关系:

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 之间的区别问题。

请指导我。

【问题讨论】:

    标签: sql database datalog


    【解决方案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, _),
      ...
    

    【讨论】:

    • mbravenboer:会不会是这样的:- 结果(H):- 徒步旅行者(H,_),! some_not_climbed(H) ?
    • 是的,如果太简单了,抱歉;)。
    • 你好马丁,我还有一个问题......如果你能帮助我,那就太好了 3个关系(边缘(X,Y),红色(X,Y),蓝色(X,Y) ) ) 被认为是一个关系可以用红色/蓝色着色的图。 a) 找到从 X 到 Y 的路径(链接边序列)的节点 X 和 Y 对?对我来说,我认为ans应该是 path(X,Y) :- edge(X,Z) , edge(Z,Y) 是否正确? b) 找到节点对 X 和 Y,其中存在从 X 到 Y 的均匀长度的路径(一系列连接的边),红色和蓝色交替。如何修改第一部分的答案以获得第二部分的答案?
    • 查看我对您为此创建的单独 SO 问题的评论。
    • @MartinBravenboer 您使用什么数据记录实现?我对提供的代码感到窒息。例如,它似乎对 high_mountain/1 中的“Height > 5000”不满意。
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。我明白你的意思。我的疑问是我们如何根据相关关系将其写入数据记录规则中。让我们说对于所有身高 > 5000 的登山者的名字,我这样写数据日志:远足者(姓名):- 山(MN,高度),攀登(HN,MN,日期),高度 > 5000。是否正确以及如何对于一些高度> 5000的山脉会有所不同吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多