2013-07-24 49 views
0

我试图满足用户给出的尽可能多的约束条件。在序言中尽可能多地满足约束条件

代码:

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_airlinesatisfy_stops必须执行。

希望我明确表示感谢您的帮助。

回答

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) 
) 
相关问题