2

我想知道如何用我拥有的元素获得一个看起来不错的列表!我一直在尝试查找有关此内容的内容,但我发现的实际示例似乎都不起作用

这是我在网上找到的一种方法:

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]]
4

2 回答 2

2

括号都错了!它应该是:

[[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列表中。

于 2013-01-04T11:02:04.467 回答
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 给谓词时,就会产生问题。

于 2013-01-04T12:22:48.540 回答