在 Prolog 中递归地将一个列表元素分配给另一个列表元素

Recursively Assigning One List Element to Another in Prolog

这是一项家庭作业,也是我第一次使用 Prolog。我的目标是根据人员列表和任务列表创建任务列表。如果一个人的字母标识符与任务匹配,那么这个人的 ID 和任务 ID 就会匹配并放置在任务列表中。我的函数打印出一个列表,但它看起来不像是在比较所有元素。示例输入:schedule([p1,p2,p3],[t1,t2],Result)。样本输出看起来像 [[p1,t1],[p2,t2][p3,t1],[p3,t2]].

我目前拥有的:

%%
%% person(ID, TASK_CAPABILITIES, AVAILABLE_HOURS)
%%
%%   How many hours each person has available and what classes of tasks they
%%   are capable of performing.
%%
person(p1, [c,a], 20).
person(p2, [b], 10).
person(p3, [a,b], 15).
person(p4, [c], 30).
%%
%% task(ID, REQUIRED_HOURS, TASK_CLASS)
%%
%%   How long each task requires and what class it falls under.
%%
task(t1, a, 5).
task(t2, b, 10).
task(t3, c, 15).
task(t4, c, 10).
task(t5, a, 15).
task(t6, b, 10).

%test arithmetic functions
add(X, Y, Z) :- Z is X + Y.
subtract(X,Y,Z) :- Z is X - Y.


schedule([],[],[]).
schedule(People,
 [Task|OtherTasks],
[[PersonId, TaskId]|RestOfAssignments]):-
  member(PersonId, People),
  person(PersonId, PersonCapabilities,_),
  member(TaskId, [Task|OtherTasks]),
  task(TaskId, TaskType,_),
  member(TaskType, PersonCapabilities),
  schedule( _, OtherTasks, RestOfAssignments).

我写的背后的原因是,人员列表将与每个任务进行比较,然后该任务将被下一个任务替换,然后重复比较。相反,我在这个函数的跟踪中看到的是,任务正在从列表中删除,但只与前两个人进行比较。我的问题是如何获得计划功能来检查每个任务的完整人员列表?

您的问题似乎没有明确说明,而且您简化了太多...代码应考虑到工作时间和会员资格。忽略这个问题,select/3 而不是 member/2 可能有助于模拟一个简单的解决方案:

schedule([],_,[]).
% peek a suitable task for PersonId
schedule([PersonId|People], Tasks, [[PersonId, TaskId]|RestOfAssignments]):-
  select(TaskId, Tasks, RestTasks),
  person(PersonId, PersonCapabilities,_),
  task(TaskId, TaskType,_),
  memberchk(TaskType, PersonCapabilities),
  schedule(People, RestTasks, RestOfAssignments).
% if no suitable task for PersonId
schedule([_PersonId|People], Tasks, Assignments):-
  schedule(People, Tasks, Assignments).

产生这些解决方案

?- schedule([p1,p2,p3],[t1,t2],Result).
Result = [[p1, t1], [p2, t2]] ;
Result = [[p1, t1], [p3, t2]] ;
Result = [[p1, t1]] ;
Result = [[p2, t2], [p3, t1]] ;
Result = [[p2, t2]] ;
Result = [[p3, t1]] ;
Result = [[p3, t2]] ;
Result = [].