%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(Company、q1(Company)、Cs) 'のように' setof/3'を使ってすべての企業を集めます。これは、重複のないソートされたリストを提供します。あなたが望むなら、 '? - setof(C、q1(C)、Cs)、member(C、Cs) 'のように会社を列挙することができます。 – mat
@mat setof、just"を使用することはできません。 !\ + < ><= > = " –
これは奇妙な要件です。少なくとも 'sort/2'を使用できますか?それ以外の場合は、SQL left joinなどの趣旨で変なトリックを行う必要があります。 –