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

时间:2019-02-15 18:21:41

标签: list recursion prolog

大家好,我想自己学习Prolog,但我坚持尝试创建一个使用嵌套列表并仅返回唯一数字列表的函数。因此unique(L,T)意味着T是从L提取的唯一数字的列表。

列表的格式如下所示,其中c后面总是一个int:

SELECT RIGHT(mycol, 10) FROM mytable

应返回true的示例:

[a,[b,[c,5],[c,3]],[c,4]]

这是我尝试过的代码,但是当我尝试查询它时,它只是返回一个空列表:

unique([b,[c,4],[c,3]], [4,3])

我也尝试了其他各种解决方案,并且似乎不断得到一个空列表作为输出或只是'false'。我将对此有任何指导!

2 个答案:

答案 0 :(得分:1)

此代码未考虑列表是嵌套的;它应该成功(例如):

unique([b,c,4,c,3],[4,3]).

您将需要一种情况,即列表的开头是列表,递归地找到其中的整数,然后将找到的内容追加到列表的末尾。

答案 1 :(得分:0)

将列表放平,对其进行过滤以获取数字,并进行排序以使其唯一:

?- 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),并从您自己的解决方案中获取启发。