“一些”问题很容易用 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, _),
...