如何使用Prolog的append/3系统谓词实现多种列表元素提取谓词
没问题!我来一步步帮你搞定Prolog里用append/3处理列表的这些需求~先从核心思路说起,append/3的逻辑是append(Left, Right, Whole),表示把列表Left和Right拼接起来就能得到Whole,我们可以利用这个拆分特性来实现各种取列表首尾元素的需求。
用append/3直接查找列表的最后2个元素
如果你只是想快速找到某个列表的最后2个元素,不用单独写谓词的话,直接利用append/3的拆分逻辑就行:
% 查询示例:找[1,2,3,4]的最后2个元素 ?- append(_, [X,Y], [1,2,3,4]). X = 3, Y = 4.
这里的_代表任意前缀列表(不管它是什么,我们只关心长度为2的后缀),所以匹配到的X和Y就是原列表的最后两个元素。
1. 实现返回列表最后一个元素的谓词last_element/2
利用append/3,我们只需要让后缀是一个单元素列表即可:
last_element(List, Last) :- append(_, [Last], List).
测试示例:
?- last_element([a,b,c,d], L). L = d. ?- last_element([5], L). L = 5.
如果传入空列表,这个谓词会直接失败,符合逻辑(空列表没有最后一个元素)。
2. 实现返回列表最后2个元素的谓词last_two_elements/2
和上面的思路类似,只是把后缀固定为长度2的列表:
last_two_elements(List, [X,Y]) :- append(_, [X,Y], List).
测试示例:
?- last_two_elements([10,20,30,40], Pair). Pair = [30,40]. ?- last_two_elements([a,b], Pair). Pair = [a,b].
如果列表长度小于2,这个谓词会失败,比如last_two_elements([x], Pair)会返回false。
3. 实现返回列表最后n个元素的谓词last_n_elements/3
这里需要先约束后缀的长度为n,再用append/3匹配后缀:
last_n_elements(List, N, LastN) :- length(LastN, N), % 先指定结果列表的长度为N append(_, LastN, List). % 匹配原列表的后缀为LastN
测试示例:
?- last_n_elements([1,2,3,4,5], 3, Result). Result = [3,4,5]. ?- last_n_elements([a,b], 2, Result). Result = [a,b].
如果N大于原列表的长度,比如last_n_elements([1,2], 3, R),谓词会失败,这是合理的。
4. 实现返回列表前n个元素的谓词first_n_elements/3
这次我们约束前缀的长度为n,后缀可以是任意列表:
first_n_elements(List, N, FirstN) :- length(FirstN, N), % 指定前缀列表的长度为N append(FirstN, _, List). % 匹配原列表的前缀为FirstN
测试示例:
?- first_n_elements([apple, banana, cherry, date], 2, Result). Result = [apple, banana]. ?- first_n_elements([x], 1, Result). Result = [x].
同样,如果N大于列表长度,谓词会失败。
内容的提问来源于stack exchange,提问作者Cap
相关产品推荐
相关产品推荐

