我有一个谓词,其格式如下: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( ... ), ... ].
Xa = [ pilot(ID,A,B,C,D,E), pilot(ID,A,B,C,D,E), pilot(ID,A,B,C,D,E), ... ]
所以我可以删除重复的条目。
答案 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)]