Prolog纯实现findall及生成1到N元素列表相关技术咨询
Prolog 开发需求实现方案
1. 生成1到N全元素列表
实现代码
% range(起始值, 终止值, 结果列表) range(Start, End, []) :- Start > End. range(Start, End, [Start|Tail]) :- Start =< End, Next is Start + 1, range(Next, End, Tail).
调用示例
生成1到10的列表:
?- range(1, 10, Res).
返回结果:Res = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2. 纯Prolog版本findall实现
核心逻辑是通过强制回溯遍历目标的所有解,将解暂存到动态谓词中,全部遍历完成后再汇总为列表。
实现代码
% 声明动态存储谓词 :- dynamic findall_temp/1. % my_findall(模板, 目标谓词, 结果列表) my_findall(Template, Goal, Result) :- % 清空历史存储 retractall(findall_temp(_)), % 回溯收集所有解 ( call(Goal), assertz(findall_temp(Template)), fail % 强制回溯继续找下一个解 ; % 所有解收集完成后汇总为列表 collect_temp(Result) ). % 辅助谓词:将存储的所有解转为列表 collect_temp([Item|Rest]) :- retract(findall_temp(Item)), !, collect_temp(Rest). collect_temp([]).
调用示例
收集所有满足X是列表[2,4,6,8,10]中大于5的元素:
?- my_findall(X, (member(X, [2,4,6,8,10]), X > 5), Res).
返回结果:Res = [6, 8, 10]
内容的提问来源于stack exchange,提问作者countres
相关产品推荐
相关产品推荐

