大家好,我想自己学习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'。我将对此有任何指导!
答案 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/2
和include/2
),并从您自己的解决方案中获取启发。