Prolog中如何实现数组连续相等元素的合并
Prolog实现连续相等元素合并去重
需求说明
需要实现列表转换逻辑,规则为:删除列表中连续重复的元素,仅保留每段连续相等元素块的第一个元素:
- 输入示例:
[1,1,1,a,b,b,3,3,3,3] - 输出示例:
[1,a,b,3]
可行实现代码
以下纯递归实现兼容SWI-Prolog、GNU Prolog等标准Prolog环境,无需依赖额外库:
% 边界条件:空列表压缩结果为空 compress([], []). % 边界条件:单元素列表压缩结果为自身 compress([X], [X]). % 递归规则1:列表前两个元素相等时,跳过第一个重复元素,继续压缩后续列表 compress([X,X|Rest], Result) :- compress([X|Rest], Result). % 递归规则2:列表前两个元素不等时,保留第一个元素,压缩剩余子列表后拼接 compress([X,Y|Rest], [X|ResultTail]) :- X \= Y, compress([Y|Rest], ResultTail).
调用验证
在Prolog解释器中执行如下查询即可验证效果:
?- compress([1,1,1,a,b,b,3,3,3,3], Res).
执行后将返回正确结果:Res = [1, a, b, 3]
补充说明:如果需要支持包含未绑定变量的列表压缩,可以将判断不等的
X \= Y替换为dif(X, Y),避免变量实例化错误。
内容的提问来源于stack exchange,提问作者Ahmed M.
相关产品推荐
相关产品推荐

