数据:
%flight(FID, Start, Destination, Company, Seats).
%-------------------------------------------------
flight(1, 'China', 'Germany', 'Lufthansa', 210).
flight(2, 'Germany', 'Dubai', 'Lufthansa', 400).
flight(3, 'China', 'Germany', 'Lufthansa', 350).
flight(4, 'Japan', 'China', 'Eurowings', 50).
flight(5, 'Russia', 'China', 'Condor', 150).
flight(6, 'China', 'China', 'Condor', 2).
我想获得在中国开始或降落的航班。首先我想出了
q2(FID) :- flight(FID, 'China', _, _, _).
q2(FID) :- flight(FID, _, 'China', _, _).
这创造了一个在中国开始或降落的航班联盟。然而,这给了我重复:
F = 1 ;
F = 3 ;
F = 6 ;
F = 4 ;
F = 5 ;
F = 6.
如何在列表中只有一次F = 6?我只能使用一组有限的运算符:,。 ! < > = +
答案 0 :(得分:3)
定义q2/1
的谓词的方式,事实id 6满足它两次(每个子句一次)。您可以通过在子句中应用更多独占条件来解决此问题:
q2(FID) :- flight(FID, 'China', D, _, _), D \== 'China'.
q2(FID) :- flight(FID, S, 'China', _, _), S \== 'China'.
q2(FID) :- flight(FID, 'China', 'China', _, _).
现在这些条款找到了所有想要的事实,但它们是相互排斥的。
或者,您可以使用setof/3
来收集它们:
setof(F, q2(F), Fs).