Prolog基于zero及s(zero)自然数实现count与member函数
Prolog皮亚诺自然数编码下的count与member实现
核心实现逻辑
- Prolog中以谓词实现逻辑,不需要使用传统函数写法,整体编码风格和你已经实现正确的
take/drop保持一致即可,全程不能使用内置整数类型、is/2算术运算。 member(元素存在校验)谓词不涉及数值计算,核心逻辑和你之前写的isInList完全一致,本身就符合编码要求,不需要做自然数相关适配。count(列表元素统计)谓词需要替换原有整数逻辑:空列表的计数结果为zero,每多一个元素,计数结果就是尾部列表计数的后继s(N),递归过程直接通过结构匹配完成计算,不需要做算术加1操作。
完整可运行代码
% 皮亚诺自然数定义(原有正确实现,无需修改) natural(zero). % zero表示0值 natural(s(X)) :- natural(X). % s(X)表示X的后继,即X+1 % 原有正确实现的take/drop,无需修改 take(zero,_,[]). take(s(_),[],[]). take(s(N),[X|Xs],[X|Ys]) :- take(N,Xs,Ys). drop(zero,Xs,Xs). drop(s(_),[],[]). drop(s(N),[_|Ys],Zs):-drop(N,Ys,Zs). % member谓词:判断元素是否存在于列表 member(X, [X|_]). % 匹配到列表头部元素,直接成立 member(X, [_|Xs]) :- member(X, Xs). % 未匹配头部则递归检查列表尾部 % count谓词:统计列表元素个数,返回皮亚诺格式自然数 count([], zero). % 空列表元素个数为zero count([_|Xs], s(N)) :- count(Xs, N). % 非空列表长度为尾部列表长度的后继
基础查询示例
- 统计3元素列表长度:执行
?- count([a,b,c], N).,返回结果N = s(s(s(zero))),对应数值3 - 判断元素存在:执行
?- member(b, [a,b,c]).,返回true;执行?- member(d, [a,b,c]).,返回false - 反向生成长度符合要求的列表:执行
?- count(L, s(s(zero))).,返回L = [_, _],即任意长度为2的列表 - 校验计数结果合法性:执行
?- count([a,b,c], N), natural(N).,验证返回的计数是合法皮亚诺自然数,结果为N = s(s(s(zero)))
内容的提问来源于stack exchange,提问作者vbcod
相关产品推荐
相关产品推荐

