Prolog目标总是出乎意料地失败



对于一个学校项目,我想构造一个调度程序来处理任务。由于我是第一次使用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。所以我的道歉,如果代码是不正确的或可以优化。

您从来没有定义过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 ).

最新更新