这是一个无穷无尽的资源分配任务的例子,逻辑编程确实非常适合并经常使用。相关任务在文献中被称为运输和分配问题,尽管这个公式中的细节有所不同。将此 Prolog 公式视为您可以解决此类任务的工作起点:
distribution([], [], []).
distribution([C-Ps|CPs], Rs0, [C-As|CAs]) :-
allocation(Ps, As, Rs0, Rs1),
As = [_|_],
distribution(CPs, Rs1, CAs).
allocation(_, [], Rs, Rs).
allocation(Ps0, [A|As], Rs0, Rs) :-
select(A, Ps0, Ps1),
select(A, Rs0, Rs1),
allocation(Ps1, As, Rs1, Rs).
distribution/3
期望它的第一个参数是一个形式对的列表,Consumer-Preferences
第二个参数是一个资源列表。它以对的形式将此实例描述与解决方案联系起来Consumer-Allocated resources
。使用 SWI-Prolog 查询您指定的具体任务的示例:
?- distribution([a-[x,w],b-[x,y,v],c-[x,z],d-[z]], [x,w,y,v,z], Ds).
Ds = [a-[w], b-[y, v], c-[x], d-[z]] ;
Ds = [a-[w], b-[v, y], c-[x], d-[z]] ;
false.
您可以将此公式用于所有此类任务。公式是完整的:它报告了所有存在的解决方案(有些是多余的,因为分配的资源可以按任何顺序说明,正如您在上面的示例中已经看到的那样;您可以引入对称破坏约束allocation/4
以避免这种情况 - 一种方法解决这个问题是坚持As
相对于标准术语顺序上升),因此如果它回答,则没有(进一步的)解决方案false
。