2016-05-12 104 views
0

數據:避免在聯盟副本在序言

%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

我認爲我們有這個了。解決方法是再次使用這些ID。 – 2016-05-12 16:51:28

+0

@Boris是的,我嘗試過,但它不是以同樣的方式工作... –

回答

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