Prolog实现repeated(L,D)谓词:不使用内置列表谓词提取重复元素
实现思路
完全不使用任何Prolog内置列表谓词,仅通过自定义3个辅助谓词完成需求:
member_manual(X, L):自定义成员判断逻辑,判断元素X是否存在于列表L中occurs_twice(X, L):判断元素X是否在列表L中至少出现2次repeated_aux/4:带累加器的辅助遍历谓词,负责遍历原列表、去重、收集符合要求的重复元素
完整实现代码
% 自定义成员判断 member_manual(X, [X|_]). member_manual(X, [_|T]) :- member_manual(X, T). % 判断元素至少出现2次 occurs_twice(X, [X|T]) :- member_manual(X, T). occurs_twice(X, [_|T]) :- occurs_twice(X, T). % 辅助遍历谓词:参数依次为<当前遍历的列表片段> <完整原列表> <已收集的重复元素集合> <最终结果> repeated_aux([], _, _, []). repeated_aux([H|T], Original, Acc, [H|ResT]) :- occurs_twice(H, Original), \+ member_manual(H, Acc), repeated_aux(T, Original, [H|Acc], ResT). repeated_aux([H|T], Original, Acc, Res) :- (\+ occurs_twice(H, Original) ; member_manual(H, Acc)), repeated_aux(T, Original, Acc, Res). % 主调用谓词 repeated(L, D) :- repeated_aux(L, L, [], D).
效果验证
运行示例查询:?- repeated([a,b,a,d,a,d], D).
返回结果和要求完全一致:D = [a,d].
内容的提问来源于stack exchange,提问作者Ne Vykelis
相关产品推荐
相关产品推荐

