相关疑难解决方法(0)

'predsort/3`的可能行为

这是关于对术语的特定参数进行排序的问题的答案的后续,而没有为a创建新列表keysort(如果我正确理解原始问题).

假设我们想predsort/3表现得如下sort/2:如果我理解正确,这将意味着将其称为:

?- predsort(compare, List, Sorted).
Run Code Online (Sandbox Code Playgroud)

现在说我们想用它predsort/3来实现排序msort/2(参见这个问题).一种方法是定义一个比较谓词Pred(-Delta, +A, +B),它不Delta=元素实际上相等的时候统一:

mcompare(Delta, A, B) :-
    compare(Delta0, A, B),
    (   Delta0 == (=)
    ->  Delta = (<)
    ;   Delta = Delta0
    ).

?- predsort(mcompare, List, Sorted).
Run Code Online (Sandbox Code Playgroud)

问题:这是否真的只是排序而不删除重复项,就像msort/2这样做?好像应该这样.

继续:说我们想要按照术语中第n个参数的标准顺序对arity> n进行排序.干净的方法是:

sort_argn(N, List, Sorted) :-
    map_list_to_pairs(arg(N), List, Pairs),
    keysort(Pairs, Sorted_pairs),
    pairs_values(Sorted_pairs, Sorted).
Run Code Online (Sandbox Code Playgroud)

如果我们想用来predsort/3达到相同的效果,我们可以尝试使用比较谓词,如下所示:

compare_argn(N, Delta, A, B) :-
    arg(N, A, …
Run Code Online (Sandbox Code Playgroud)

sorting compare list prolog stable-sort

8
推荐指数
1
解决办法
345
查看次数

标签 统计

compare ×1

list ×1

prolog ×1

sorting ×1

stable-sort ×1