对于学校项目,我想构建一个用于处理任务的调度程序。由于这是我第一次使用Prolog,我遇到了一些困难;甚至在寻找解决方案之后。
execution_schedule_checker(...)规则使用仿函数列表调用process_schedule_of_core(...),如下所示:
[schedule(c1, [t1, t6, t7]), schedule(c2, [t2, t3, t4, t5])]
以下是声明的事实:
core(c1).
core(c2).
task(t1).
task(t2).
...
execution_schedule_checker([schedule(Core, Tasks) | RestSchedules ], ListOfCores, ListOfTasks, ListProcessedTasks, ListProcessedCores) :-
process_schedule_of_core(Core, Tasks, ListProcessedTasks, ListProcessedCores, ListProcessedTasksAcc),
execution_schedule_checker(RestSchedules, ListOfCores, ListOfTasks, ListProcessedTasksAcc, ListProcessedCores).
process_schedule_of_core(Core , [], ListProcessedTasks , [Core| _], ListProcessedTasks).
process_schedule_of_core(Core, [Task | RestTasks], ListProcessedTasksAcc , ListProcessedCores, ListProcessedTasks) :-
process_schedule_of_core(Core, RestTasks, [Task | ListProcessedTasksAcc], ListProcessedCores, ListProcessedTasks).
一切正常,直到达到第二个计划结束。它失败了,程序停止了。
就像我之前说过的那样,这是我第一次使用Prolog。如果代码不正确或可以优化,我很抱歉。
答案 0 :(得分:1)
如果日程表列表为空,您从未定义execution_schedule_checker
应该执行的操作。
假设您正在“检查”所有核心和任务在整个计划中出现一次,这应该是:
% execution_schedule_checker(S,C,T) is true if the schedules in S use all cores in C and tasks in T exactly once
execution_schedule_checker( [], [], [] ).
execution_schedule_checker( [schedule(Core, Tasks)|Schedules], UnusedCores, UnusedTasks ) :-
split1( Core, UnusedCores, StillUnusedCores ),
split( Tasks, UnusedTasks, StillUnusedTasks ),
execution_schedule_checker( Schedules, StillUnusedCores, StillUnusedTasks ).
% split( L1, L2, L3 ) is true if append( L1, L2, L12 ) and L12 is a permutation of L3
split( [], L, L ).
split( [H|T], L1, L3 ) :-
split1( H, L1, L2 ),
split( T, L2, L3 ).
% split1( A, L1, L2 ) === split( [A], L1, L2 )
split1( X, [X|T], T ).
split1( X, [H|T], [H|T2] ) :-
split1( X, T, T2 ).