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_*谓词工作正常并根据参数返回真或假。


问题: 在上面的代码中,我遇到的问题是我只想执行相应的satisfy_*谓词,前提是它在Startmember/2变量验证的哪个谓词中。

因此,如果Start包含[airline, stops],则只有satisfy_airline并且satisfy_stops必须执行。

希望我说清楚了,并感谢您的帮助。

4

1 回答 1

1

试试forall/2

forall((成员(X,开始),
       成员((X,Pred,Pref),[(航空公司,satisfy_airline,Pref_Airlines),...])),
      呼叫(Pred,FlightNo,Pref))

“……”因为我很懒。只是原子的三元组,相应的满足谓词和相应的偏好。这代替了所有成员/满足目标。

如果这不起作用,请告诉我,我不是特别有信心......

编辑:如果这不起作用,那么你可以这样做,虽然它不是很漂亮:

(
   (成员(航空公司,开始)->满足_航空公司(FlightNo,Pref_Airlines);真),
   (成员(计时,开始)-> 满足时间(FlightNo,Pref_Timings);真),
   (成员(停止,开始)->满足_停止(FlightNo,Pref_Stops);真)
)
于 2013-07-24T19:55:59.023 回答