prolog,列出适当的括号作为结果

时间:2013-01-04 10:58:30

标签: prolog

我想知道如何使用我拥有的元素获得一个漂亮的正确列表!我一直在努力查找这些内容,但我发现的实际例子似乎都没有实际工作

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

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

2 个答案:

答案 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作为谓词时,会创建该问题。