繁体   English   中英

Prolog - 返回嵌套列表中唯一数字的列表

[英]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/2include/2 )并为您自己的解决方案获取灵感。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM