Prolog实现从列表提取两个元素并将剩余元素存入新列表
Prolog谓词list/4实现方案
实现代码
list(A, X, Y, R) :- select(X, A, TempList), select(Y, TempList, R).
实现说明
- 这里用到了Prolog内置的
select/3谓词,作用是从输入列表中取出指定元素,返回取出元素后剩余的列表 - 执行逻辑:
- 第一步从输入列表
A中取出元素绑定到X,剩余元素存入临时列表TempList - 第二步从临时列表
TempList中取出元素绑定到Y,剩余元素即为最终结果R
- 第一步从输入列表
- 边界情况自动适配:
- 如果
A长度小于2,第一步取完X后剩余列表长度不足1,第二步select直接失败返回false,符合要求的边界返回规则 - 列表存在重复元素时也会按排列逻辑返回所有符合条件的解,和示例中
[1,1]的返回结果完全匹配
- 如果
补充:手动实现select/3(可选)
如果你的运行环境不支持内置select/3,可以自行添加如下定义:
select(X, [X|Rest], Rest). select(X, [Y|Rest], [Y|SelectRest]) :- select(X, Rest, SelectRest).
效果验证
在Prolog环境中运行示例查询可以得到完全匹配的结果:
?- list([],X,Y,R). false. ?- list([1],X,Y,R). false. ?- list([1,2],X,Y,R). X = 1, Y = 2, R = [] ; X = 2, Y = 1, R = []. ?- list([1,1],X,Y,R). X = 1, Y = 1, R = [] ; X = 1, Y = 1, R = []. ?- list([1,2,3],X,Y,R). X = 1, Y = 2, R = [3] ; X = 1, Y = 3, R = [2] ; X = 2, Y = 1, R = [3] ; X = 2, Y = 3, R = [1] ; X = 3, Y = 1, R = [2] ; X = 3, Y = 2, R = [1].
内容的提问来源于stack exchange,提问作者Tony
相关产品推荐
相关产品推荐

