在prolog中满足尽可能多的约束

时间:2013-07-24 19:36:46

标签: prolog

我试图满足用户给出的尽可能多的约束。

代码:

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

希望我清楚明白并感谢你的帮助。

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)
)