Prolog - 确定列表中重复的数量并将数量转换为指数

Posted

技术标签:

【中文标题】Prolog - 确定列表中重复的数量并将数量转换为指数【英文标题】:Prolog - determine amount of duplicates in list and turn the amount into an exponent 【发布时间】:2018-09-20 12:49:10 【问题描述】:

我想计算重复的数量并删除它们,并将重复的数量打印为指数。非重复项保持不变。例如:

exponent([2, 2, 3, 5, 5], X).
X = [2^2, 3, 5^2]

exponent([2, 2, 2, 2, 2, 2, 2], X).
X = [2^7]

【问题讨论】:

在您当前的方法中什么不起作用? 这有点像'游程编码' ... 你期望[2, 2, 3, 5, 5,2,2]的输出是什么?? @coder: [2^2, 3, 5^2, 2^2] 鉴于我理解正确,因此它是一种压缩,您每次都指定“此值重复 n 次”。 @coder [2^4, 3, 5] 但列表中的数字只会递增,因此所有 2 都紧随其后 【参考方案1】:

通过“吃”您的列表并同时以 Prologish 特有的自上而下的方式构建结果,很容易安排:

exponent( [X | XS], Ex ):-
    exponent( 1, X, XS, Ex ).

等等,什么?我们还没有说任何具体的内容......除了我们现在已经看到 one X。那么,

exponent( I, X, [Y | XS], Ex ):-
    (   X =:= Y 
    ->  I1 is ...., 
        exponent(I1, X, XS, Ex)    % right? we go on 'eating up' the input
    ;
        Ex = [ (I,X) | Ex2 ],      % intentionally 'wrong' output
        exponent( 1, ........ )
    ).

看到了吗?

当然,基本情况会丢失,但您可以从这里获取!

【讨论】:

以上是关于Prolog - 确定列表中重复的数量并将数量转换为指数的主要内容,如果未能解决你的问题,请参考以下文章

检测和删除最少数量的不一致事实的算法(可能在 PROLOG 中)?

Prolog添加功能

根据Prolog中公共子树的数量,树之间的递归相似度

Flask GET - 在 URL 中检索未确定数量的参数

计算列表中值的数量[重复]

Prolog中的展平列表[重复]