查询数据记录
Datalog for query
我需要以下查询的帮助:
给定关系:
hiker(HN, Name), mountain(MN, Height), climbed(HN, MN, Date).
Q.:为以下查询提供安全的数据记录规则(必要时进行否定):
(a) 找出Height > 5000m
.
爬过一些山的徒步旅行者的名字
我是这样写的
hiker(Name): - moutain(MN, Height), climbed(HN, MN, Date), Height > 5000
但是如果我必须找到攀登过每座高度 > 5000m 的山峰的徒步旅行者的名字,我很难理解 some 和 every 之间的区别这两个问题。
请指导我。
假设我们有 3 座高度大于 5000 的山(名称:M1、M2、M3)。
一位名叫X的徒步旅行者已经攀登了5座山(M1、M20、M30、M40、M50),其中只有一座山的高度超过5000(M1)。
这个徒步旅行者的名字应该出现在第一个问题的列表中,因为他已经攀登了 'some' 座 > 5000 座山。
然而,这位登山者没有攀登过所有高于5000的山峰(他没有攀登过M2和M3),所以他的名字不应该出现在第二个名单中。
'some' 问题很容易用像 Datalog 和 SQL 这样的语言表达,因为每个徒步旅行者只需要找到一座山。徒步旅行者是否徒步过一座、两座或更多座山并不重要。数据记录规则非常适合这个。
result(Name) :-
hiker(H, Name),
climbed(H, M, _),
mountain(M, Height), Height > 5000.
'every' 问题更难回答,因为您现在需要确认徒步旅行者已经攀登了每一座山,而不仅仅是其中一座。
假设一个封闭的世界数据库,'every'问题可以翻译成双重否定,这很容易表达。您需要搜索不存在他们未攀登的> 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, _),
...
我需要以下查询的帮助:
给定关系:
hiker(HN, Name), mountain(MN, Height), climbed(HN, MN, Date).
Q.:为以下查询提供安全的数据记录规则(必要时进行否定):
(a) 找出Height > 5000m
.
我是这样写的
hiker(Name): - moutain(MN, Height), climbed(HN, MN, Date), Height > 5000
但是如果我必须找到攀登过每座高度 > 5000m 的山峰的徒步旅行者的名字,我很难理解 some 和 every 之间的区别这两个问题。
请指导我。
假设我们有 3 座高度大于 5000 的山(名称:M1、M2、M3)。
一位名叫X的徒步旅行者已经攀登了5座山(M1、M20、M30、M40、M50),其中只有一座山的高度超过5000(M1)。
这个徒步旅行者的名字应该出现在第一个问题的列表中,因为他已经攀登了 'some' 座 > 5000 座山。
然而,这位登山者没有攀登过所有高于5000的山峰(他没有攀登过M2和M3),所以他的名字不应该出现在第二个名单中。
'some' 问题很容易用像 Datalog 和 SQL 这样的语言表达,因为每个徒步旅行者只需要找到一座山。徒步旅行者是否徒步过一座、两座或更多座山并不重要。数据记录规则非常适合这个。
result(Name) :-
hiker(H, Name),
climbed(H, M, _),
mountain(M, Height), Height > 5000.
'every' 问题更难回答,因为您现在需要确认徒步旅行者已经攀登了每一座山,而不仅仅是其中一座。
假设一个封闭的世界数据库,'every'问题可以翻译成双重否定,这很容易表达。您需要搜索不存在他们未攀登的> 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, _),
...