%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,!.
但是,這退出後第一次返回,也。任何想法如何我可以退回一個公司只匹配一次使用剪切?
FID是主鍵,我只允許使用。 ,+ <> < => =
首先,刪除'!/ 0':它破壞了程序的預期含義。然後收集所有使用'setof/3'的公司,像這樣:'? - setof(Company,q1(Company),Cs)。「這給你一個沒有重複的排序列表。如果你願意,你可以用'? - setof(C,q1(C),Cs),成員(C,Cs)來枚舉公司。' – mat
@mat我不允許使用setof,只是「,。 !\ + < ><= > =「 –
這是一個奇怪的要求。你能至少使用'sort/2'嗎?否則,你需要在SQL左連接或類似的東西的精神下做一個奇怪的詭計。 – 2016-05-12 12:36:43