我想知道如何使用我拥有的元素获得一个漂亮的正确列表!我一直在努力查找这些内容,但我发现的实际例子似乎都没有实际工作
以下是我在网上找到的一种方法:
create_list(Item, List, [Item|List]).
如果我运行此查询:
Hi = [1,2], Hey = [3,4], create_list(Hi, Hey, Output).
结果很奇怪:
Output = [[1,2], 3,4]
括号都错了! 它应该是:
[[1,2], [3,4]]
答案 0 :(得分:1)
括号都错了!它应该是:
[[1,2], [3,4]]
这是因为您的create_list
使用[Item|List]
。如果您希望保留[3,4]
周围的括号,请将[Item|List]
替换为[Item,List]
。当然List
现在有不正确的含义,所以我会重命名它,如下所示:
list_of_two(First, Last, [First, Last]).
然而,这不适用于两个以上的项目。你原来的一条规则会起作用,如下:
create_list([1,2],[],O1), create_list([3,4],O1,O2), create_list([5,6],O2,O3).
这会产生
[[5, 6], [3, 4], [1, 2]]
在O3
列表中。
答案 1 :(得分:1)
与其他语言相比,列表是Prolog中非常基础的数据结构:
[]
是/创建一个空列表
[1]
是/创建一个包含单个元素的列表
[1,2,3,4,....,n]
是/创建一个包含n
元素的列表
[1|[2,3,4]]
通过在列表1
中插入[2,3,4]
来创建列表(结果为[1,2,3,4]
)
因此,您不需要谓词来“创建”列表:如果您有n
个元素,只需将它们放在括号中;如果元素是递归生成的,请使用|
创建包含新元素的列表。例如:
put_in_list(A1,A2,A3, L):- L = [A1,A2,A3].
或者:
put_in_list(A1,A2,A3, [A1,A2,A3]).
也:
generate(0, []).
generate(N, [ [N, NN]| Rest ]):-
NN is N-1,
NNN is N-2,
generate(NNN, Rest).
总而言之,你应该小心类型;在你的情况下,你有一个数字列表(让我们称之为X),你想要一个数字列表列表(所以这将是一个X列表)。当您将X列表作为参数而不是X作为谓词时,会创建该问题。