我试图满足用户给出的尽可能多的约束。
代码:
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
必须执行。
希望我说清楚了,并感谢您的帮助。