我试图满足用户给出的尽可能多的约束。
代码:
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_*
由Start
变量验证的member/2
中执行时才执行相应的Start
谓词。
因此,如果[airline, stops]
包含satisfy_airline
,那么只有satisfy_stops
和{{1}}必须执行。
希望我清楚明白并感谢你的帮助。
答案 0 :(得分:1)
尝试forall/2
。
forall((member(X,Start), member((X,Pred,Pref),[(airlines,satisfy_airline,Pref_Airlines), ...])), call(Pred,FlightNo,Pref))
“......”因为我很懒。只是原子的三元组,相应的满足谓词和相应的偏好。这取代了所有成员/满足目标。
如果这不起作用,请告诉我,我并不是特别自信......
编辑:如果那不起作用那么你可以这样做,虽然它不是很漂亮:
( (member(airlines,Start) -> satisfy_airlines(FlightNo,Pref_Airlines) ; true), (member(timings,Start) -> satisfy_times(FlightNo,Pref_Timings) ; true), (member(stops,Start) -> satisfy_stops(FlightNo,Pref_Stops) ; true) )