请求解释Prolog代码执行逻辑及指定查询的输出结果
Prolog代码功能与执行过程分析
功能说明
这段代码是一个列表元素范围筛选工具,核心作用是从输入列表中提取所有满足 N ≤ 元素 ≤ M 的元素,并保留原列表的元素顺序,生成新的结果列表。
子句拆解与执行逻辑
代码包含4个子句,构成递归处理逻辑:
- 基础终止子句:
p([],[],_).
当输入的原列表为空时,结果列表也为空,第三个(N)和第四个(M)参数无限制,这是递归的终止条件。 - 保留符合条件元素的子句:
p([H|T],[H|R],N,M) :-H >= N, H =< M, p(T,R,N,M).
如果当前列表的头元素H落在[N, M]区间内,就将H加入结果列表,然后递归处理剩余的列表T,生成结果列表的剩余部分R。 - 跳过小于N的元素:
p([H|T],R,N,M) :- H < N, p(T,R,N,M).
如果H小于下限N,直接跳过该元素,递归处理剩余列表T,结果列表的剩余部分R由后续处理生成。 - 跳过大于M的元素:
p([H|T],R,N,M) :- H > M, p(T,R,N,M).
如果H大于上限M,直接跳过该元素,递归处理剩余列表T,结果列表的剩余部分R由后续处理生成。
查询语句p([5,3,6,3,7],L,4,7).的执行过程与结果
执行步骤
- 初始调用
p([5,3,6,3,7],L,4,7):头元素5满足4≤5≤7,将5加入结果,递归处理剩余列表[3,6,3,7],记结果剩余部分为R1,即L=[5|R1]。 - 处理
[3,6,3,7]:头元素3<4,跳过该元素,递归处理剩余列表[6,3,7],记结果剩余部分为R2,即R1=R2。 - 处理
[6,3,7]:头元素6满足4≤6≤7,将6加入结果,递归处理剩余列表[3,7],记结果剩余部分为R3,即R2=[6|R3]。 - 处理
[3,7]:头元素3<4,跳过该元素,递归处理剩余列表[7],记结果剩余部分为R4,即R3=R4。 - 处理
[7]:头元素7满足4≤7≤7,将7加入结果,递归处理剩余列表[],触发终止子句,结果剩余部分为[],即R4=[7|[]]。 - 回溯拼接所有结果:
R4=[7]→R3=[7]→R2=[6,7]→R1=[6,7]→L=[5,6,7]。
输出结果
查询最终返回:
L = [5, 6, 7]
内容的提问来源于stack exchange,提问作者Liam Neeson
相关产品推荐
相关产品推荐

