在prolog

时间:2015-05-29 19:48:52

标签: prolog

我有一个谓词,其格式如下:pilot( ID1, ID2 ).

我正在为pilot找到多个值,我可以从findall获取这个谓词,但我怎样才能从那里开始使用新的谓词来创建这样的列表:

[ pilot( ID1, ID2 ), pilot( ID1, ID2 ), pilot( ID1, ID2 ), pilot( ID1, ID2 ), ... ].

[澄清]

我这样做:我要求提供航班的ID:ID

并执行此操作:findall( flightS( PILOTS ), flight( ID, PILOTS, _, _, _, _), Xs).

我得到这样的东西:

Xs = [ flightS( 1, 2 ), flightS( 4, 7 ), flightS( ... ), ... ].

然后,我接收该信息并找到与航班ID相关的最终导航。我可以得到每个飞行员,我可以写()他们,我的问题是,我有多个相同的飞行员,因为多次飞行,我想把所有的飞行员,有这种结构:飞行员(ID, A,B,C,D,E),并将它们全部放在这样的列表中:

Xa = [ pilot(ID,A,B,C,D,E), pilot(ID,A,B,C,D,E), pilot(ID,A,B,C,D,E), ... ]所以我可以删除重复的条目。

1 个答案:

答案 0 :(得分:0)

问题的输入格式不明确。 如果每个航班 - 飞行员对都有一个谓词,则可以这样做:

% flight(ID, PILOT)
flight(1, 100).  flight(1, 102).
flight(2, 100).  flight(2, 103).
flight(3, 102).  flight(3, 103).  flight(3, 104).

:- ID=3,                                            % flight id
   findall(pilot(PILOT), flight(ID, PILOT), Xs),    % find all solutions
   sort(Xs, UniquePilots),                          % remove duplicates
   writeln(UniquePilots).
  

[pilot(102),pilot(103),pilot(104)]

或者,如果您有一个航班和多个飞行员的单个谓词,那么这个将执行:

% flight(ID, PILOTS)
flight(1, [100, 102]).
flight(2, [100, 103]).
flight(3, [102, 103, 104]).
flight(3, [100, 102]).

:- ID=3,
   findall(pilot(PILOT), (flight(ID, PILOTS), member(PILOT, PILOTS)), Xs),
   sort(Xs, UniquePilots),
   writeln(UniquePilots).
  

[pilot(100),pilot(102),pilot(103),pilot(104)]