Prolog目标总是意外失败

时间:2015-08-03 19:44:14

标签: 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。如果代码不正确或可以优化,我很抱歉。

1 个答案:

答案 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 ).