Prolog提取列表正元素谓词代码正确性验证问询
代码正确性判断
这段Prolog代码完全不正确,存在多处核心逻辑错误:
- 误用
is运算符:Prolog里is仅用于将右侧算术表达式的计算结果赋值给左侧变量,你写的L is N > 0逻辑完全不成立,此时N是未绑定的自由变量,执行到这一步会直接报错,且L是最终输出的正元素列表,根本不应该被赋值为布尔判断的结果。 - 完全没有用到列表头元素
H:筛选正元素的核心是判断当前头元素H是否为正,你写的子句里从头到尾没用到H,不可能实现筛选逻辑。 - 递归逻辑完全颠倒:你先做了
L is N > 0的判断,才调用pos(T,N)获取尾列表的结果,此时N还没有任何绑定,执行必然失败。
正确实现代码
核心逻辑如下:
- 空列表的正元素筛选结果是空列表(你写的边界条件是对的)
- 若当前列表头元素为正,就将它加入结果列表的头部,再递归处理尾列表
- 若当前列表头元素非正,直接递归处理尾列表作为结果
pos([], []). pos([H|T], [H|ResT]) :- H > 0, pos(T, ResT). pos([H|T], Res) :- H =< 0, pos(T, Res).
内容的提问来源于stack exchange,提问作者Fabiola Salomone
相关产品推荐
相关产品推荐

