[英]Prolog - return list of unique numbers in nested lists
大家好,我正在尝试自己学习 Prolog,但我一直在尝试创建一个函数,该函数采用嵌套列表并返回仅包含唯一数字的列表。 所以 unique(L,T) 意味着 T 是从 L 中提取的唯一数字列表。
列表的格式如下所示,其中 c 后面总是跟一个 int:
[a,[b,[c,5],[c,3]],[c,4]]
应该返回 true 的示例:
unique([b,[c,4],[c,3]], [4,3])
这是我尝试过的代码,但是当我尝试查询它时它只是返回一个空列表:
unique([],[]).
unique([X|XS],[X|L]) :-
integer(X),
unique(XS,L).
unique([X|XS],L) :-
\+integer(X),
unique(XS,L).
我也尝试过各种其他解决方案,但似乎不断得到一个空列表作为输出或只是“假”。 我将不胜感激任何形式的指导!
这段代码没有考虑到列表是嵌套的; 它应该成功(例如):
unique([b,c,4,c,3],[4,3]).
您将需要一个列表头是一个列表的情况,递归地找到其中的整数,并将您找到的内容附加到您为列表尾部找到的内容中。
展平列表,过滤它以获取数字,排序以使其唯一:
?- L = [a,[b,[c,5],[c,3]],[c,4]], flatten(L, F), include(number, F, N), sort(N, Unique_numbers).
L = [a, [b, [c, 5], [c, 3]], [c, 4]],
F = [a, b, c, 5, c, 3, c, 4],
N = [5, 3, 4],
Unique_numbers = [3, 4, 5].
如果您想保持原始顺序,则无法排序,但是 SO 上有很多答案会告诉您如何操作。
如果您不想使用库谓词,请查看它们的定义方式( flatten/2
和include/2
)并为您自己的解决方案获取灵感。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.