【发布时间】:2016-05-12 22:58:07
【问题描述】:
数据:
%flight(FID, Start, Destination, Company, Seats).
%------------------------------------------------------
flight(1, 'Paris', 'Berlin', 'Lufthansa', 210).
flight(2, 'Frankfurt', 'Dubai', 'Lufthansa', 400).
flight(3, 'Rome', 'Barcelona', 'Eurowings', 350).
我想了解所有拥有超过 200 个座位的航班的公司。但每家公司只能退回一次。
我试过了:
q1(Company) :- flight(_, _, _, Company, S), S > 200.
但这会返回两次汉莎航空。我试过了:
q1(Company) :- flight(_, _, _, Company, S), S > 200,!.
但这在汉莎航空首次返回后退出。我想我必须将条件包装在子查询中:
q1(Company) :- flight(_, _, _, Company, S), q12(S).
q12(S) :- flight(_, _, _, _, S), S > 200,!.
但这在第一次返回后也退出了。知道如何使用 cut 返回只匹配一次的公司吗?
FID 是主键,我只能使用 . , + =
【问题讨论】:
-
首先,删除
!/0:它破坏了程序的预期含义。然后使用setof/3收集所有公司,如下所示:?- setof(Company, q1(Company), Cs).这将为您提供一个没有重复的排序列表。如果你愿意,你可以列举公司,例如?- setof(C, q1(C), Cs), member(C, Cs). -
@mat 我不允许使用 setof,只能使用 ", . ! \+ ="
-
这是一个奇怪的要求。你至少可以使用
sort/2吗?否则,您需要本着 SQL 左连接或类似的精神做一个奇怪的把戏。 -
@Boris 你能告诉我这个奇怪的把戏吗?
-
我得考虑一下。您可以尝试在 SQL 标记上寻找灵感 :) 或者也许有人已经为您准备好了答案。
标签: prolog