我试图满足用户给出的尽可能多的约束条件。在序言中尽可能多地满足约束条件
代码:
findall(Option, execute(List, ListItems, T, Option, ListItems), Gathered).
execute([],_,_,_,_).
execute([_|Rest], [], Pref, Answer, Backup):-
execute_combinations(Rest, Backup, Pref, Answer, Backup).
execute(Combinations, [H|T], Pref, Answer, Backup):-
[Pref_Airlines, Pref_Timings, Pref_Stops] = Pref,
[Start|_] = Combinations,
[FlightNo, _, _, _] = H,
(
member(airlines, Start), satisfy_airline(FlightNo, Pref_Airlines);
member(timings, Start), satisfy_time(FlightNo, Pref_Timings);
member(stops, Start), satisfy_stops(FlightNo, Pref_Stops);
),
Option = H;
execute(Combinations, T, Pref, Option).
描述:
List/Combinations
包含(airline, timings, stops)
组合,这些都是形式:
[airline, timings, stops], [airline, timings], [timings, stops], [stops], [airline], etc..
findall
正在用于收集成功的选项。
ListItems
包含表格[FlightNo, X, Y, Z]
的嵌套列表。
satisfy_*
谓词正常工作,根据参数返回true或false。
问题: 在上面的代码中,我有问题是,我想执行各个satisfy_*
谓词仅当它是在由可变member/2
验证Start
。
因此,如果Start
包含[airline, stops]
,那么只有satisfy_airline
和satisfy_stops
必须执行。
希望我明确表示感谢您的帮助。