Prolog目标总是意外失败

Prolog目标总是意外失败,prolog,Prolog,对于学校项目,我想构造一个用于处理任务的调度器。由于这是我第一次使用Prolog,我遇到了一些困难;即使在寻找了一段时间的解决方案之后 执行计划检查器(…)规则正在调用具有以下函数列表的核心(…)的进程计划,如下所示: [schedule(c1, [t1, t6, t7]), schedule(c2, [t2, t3, t4, t5])] 以下是公布的事实: core(c1). core(c2). task(t1). task(t2). ... execution_schedule_che

对于学校项目,我想构造一个用于处理任务的调度器。由于这是我第一次使用Prolog,我遇到了一些困难;即使在寻找了一段时间的解决方案之后

执行计划检查器(…)规则正在调用具有以下函数列表的核心(…)的进程计划,如下所示:

[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。因此,如果代码不正确或可以优化,我深表歉意。

如果计划列表为空,您从未定义
执行计划\u 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 ).

请显示您正尝试测试的查询。执行计划检查程序([schedule(c1[t1,t6,t7])、计划(c2[t2,t3,t4,t5])、[c1,c2]、[t1,t2,t3,t4,t5,t6,t7]、ListProcessedTasks、ListProcessedCores)。现在,您可以解释一下这是在做什么,以及它是如何做的吗?为什么要费心定义
task()
core()
,因为它们在任何地方都不会被使用?在这段代码中,我只是尝试将所有已处理的任务放在ListProcessedTasksAcc中,将所有已处理的核心放在ListProcessedCores中。它只是一个类似于“append”的函数。我不断地将任务放在列表中,直到到达空列表,然后将核心添加到已处理核心的列表中。这就是核心()的
进程计划中所发生的事情。
core()
task()
在程序中的其他地方使用,但它们只是定义了一个核心和一个任务(例如:带有c1的核心(c1)是唯一标识符)。这是“如何”,而不是“什么”。听起来您想收集计划列表中的所有任务和核心,并确保每个任务和核心只显示一次。
execution\u schedule\u checker([],ListOfCores,listofttask,listProcessedtask,ListProcessedCores):-length(listProcessedtask,Lpt),length(ListProcessedCores,Lpc),length(listofttask,Lot),长度(ListOfCores,Loc),Lpt=Lot,Lpc=Loc。
当调用
process\u schedule\u of_core()
的第一行时会出现问题。当到达空列表时。
execution\u schedule\u checker
在列表为空(您刚刚发布的代码)时不会调用
process\u schedule\u of_core
。这就是我的意图。如果列表为空,则表示不需要处理更多的计划/任务/核心。“当到达空列表时,调用'process\u schedule\u of_core*的第一行时会出现问题。”但如果没有调用它,它怎么会导致任何问题?