2

我在 Prolog 中有这样的数据结构:

racks =
 [
  [
   (1-1), 1,
   [
    shelf((0-0), 1, [ware_a:[0,10]]),
    shelf((0-1), 2, []),
    shelf((0-2), 3, [])
   ]
 ],
 [
  (2-1), 2,
  [
   shelf((0-0), 4, []),
   shelf((0-1), 5, []),
   shelf((0-2), 6, [])
  ]
 ].

一个机架具有坐标 (xy)(例如 (1-1))、成本值和货架列表。货架本身具有相同的坐标(在货架内)、成本值和内容列表(商品,位于货架上)。

现在,在我的程序执行期间,可能会混淆机架或架子的顺序。

例如:

racks =
 [
  (2-1), 2,
  [
   shelf((0-0), 4, [ware_c:[50,100]]),
   shelf((0-1), 5, []),
   shelf((0-2), 6, [])
  ]
 ],
 [
  [
   (1-1), 1,
   [
    shelf((0-1), 2, [ware_b:[1,2], ware_a:[10,20]]),
    shelf((0-0), 1, [ware_a:[0,10]]),
    shelf((0-2), 3, [])
   ]
 ].

现在,我正在寻找对这些列表进行排序的可能性。它们(架子和其中的架子)应按成本值排序(坐标无关紧要)。

我怎样才能做到这一点?!

我在Prolog中对列表进行排序方面没有太多经验,所以我想让你们问,伙计们!

谢谢你的帮助!!

4

1 回答 1

2

我认为更好的选择,性能方面,应该是keysort:做一个服务谓词(一个事实,真的),从术语中“提取”键,对配对列表进行键排序,然后相同的服务谓词可以“反转”并丢弃键从排序列表中:

extract_key([A,K|T], K-[A,K|T]).

% note the uppercase Racks. It's a variable!
Racks = [[...]], % your complex structure here
maplist(extract_key, Racks, Keyed),
keysort(Keyed, KeySorted),
maplist(extract_key, Sorted, KeySorted),
% use Sorted in futher processing

效率较低,有predsort /3,可以更容易编写,使用标准的术语顺序,即比较/3,但注意不要返回相等,否则算法将丢弃整个记录(predsort,与排序一样,丢弃重复)。

cmprecords(R,[_,K1|_],[_,K2|_]) :- compare(R,K1,K2). % beware, discards on K1==K2

% note the uppercase Racks. It's a variable!
?- Racks = [...], predsort(cmprecords, Racks, Sorted).
于 2013-10-28T14:21:58.803 回答