我试图满足用户给出的尽可能多的约束。
代码:
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_*谓词工作正常并根据参数返回真或假。
问题:
在上面的代码中,我遇到的问题是我只想执行相应的satisfy_*谓词,前提是它在Start由member/2变量验证的哪个谓词中。
因此,如果Start包含[airline, stops],则只有satisfy_airline并且satisfy_stops必须执行。
希望我说清楚了,并感谢您的帮助。