避免在prolog中使用重复项

时间:2016-05-12 15:54:26

标签: prolog

数据:

%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?我只能使用一组有限的运算符:,。 ! < > = +

1 个答案:

答案 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).