Prolog中如何定义cutlast(L1,L2)谓词移除列表最后一个元素
Prolog中
cutlast/2谓词的定义方法 cutlast(L1, L2)谓词的成立条件为:L2是L1移除最后一个元素后得到的列表,空列表由于不存在可移除的最后一个元素,无法满足该谓词判定条件。
基础递归实现
无需依赖内置谓词,通过递归拆分列表即可实现:
% 基线规则:长度为1的列表移除最后一个元素后得到空列表 cutlast([_], []). % 递归规则:两个列表头部元素一致,对原列表尾部和结果列表尾部递归执行判定 cutlast([Head|Tail1], [Head|Tail2]) :- cutlast(Tail1, Tail2).
基于append/3内置谓词的简洁实现
利用标准Prolog环境通用的列表拼接内置谓词,可以写出更简短的等价实现,核心逻辑为:L1可以拆分为L2拼接一个任意单元素(即L1的最后一个元素):
cutlast(L1, L2) :- append(L2, [_], L1).
效果验证
两种实现均支持双向查询,常见查询的返回结果符合预期:
- 执行
cutlast([1,2,3,4], Res),返回Res = [1,2,3] - 执行
cutlast(Origin, [x,y]),返回Origin = [x, y, _](末尾匿名变量代表任意合法值,即所有以[x,y]为前缀、长度多1的列表都满足条件) - 执行
cutlast([9], Res),返回Res = [] - 执行
cutlast([], Res),返回false,空列表无元素可移除,判定不成立
注意:实现过程不要随意添加截断(cut)操作,否则会破坏谓词双向查询的能力,只能单向从完整列表计算截断结果。
内容的提问来源于stack exchange,提问作者Nuwanthi Karunarathne
相关产品推荐
相关产品推荐

