在prolog中避免在联合中重复

在prolog中避免在联合中重复,prolog,Prolog,数据: 我想订在中国起飞或降落的航班。首先我想到了 %flight(FID, Start, Destination, Company, Seats). %------------------------------------------------- flight(1, 'China', 'Germany', 'Lufthansa', 210). flight(2, 'Germany', 'Dubai', 'Lufthansa', 400). flight(3, 'China', 'Germa

数据:

我想订在中国起飞或降落的航班。首先我想到了

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

对于
q2/1
的谓词的定义方式,事实id 6满足它两次(每个子句一次)。您可以通过在您的条款中应用更多排他性条件来解决此问题:

F = 1 ;
F = 3 ;
F = 6 ;
F = 4 ;
F = 5 ;
F = 6.
现在,这些条款找到了所有需要的事实,但相互排斥

或者,您可以使用
setof/3
收集它们:

q2(FID) :- flight(FID, 'China', D, _, _), D \== 'China'.
q2(FID) :- flight(FID, S, 'China', _, _), S \== 'China'.
q2(FID) :- flight(FID, 'China', 'China', _, _).

定义
q2/1
谓词的方式是,事实id 6满足它两次(每个子句一次)。您可以通过在您的条款中应用更多排他性条件来解决此问题:

F = 1 ;
F = 3 ;
F = 6 ;
F = 4 ;
F = 5 ;
F = 6.
现在,这些条款找到了所有需要的事实,但相互排斥

或者,您可以使用
setof/3
收集它们:

q2(FID) :- flight(FID, 'China', D, _, _), D \== 'China'.
q2(FID) :- flight(FID, S, 'China', _, _), S \== 'China'.
q2(FID) :- flight(FID, 'China', 'China', _, _).

我想我们已经有了。解决这个问题的办法是,再次使用ID。@Boris是的,我试过了,但效果不一样……我想我们已经有了。解决这个问题的方法是再次使用IDs。@Boris是的,我试过了,但效果不一样。。。