Prolog - 如何生成特定长度的列表?

时间:2017-09-30 21:00:07

标签: list prolog

我正在做这个练习,我必须编写一个谓词randomnames/1来生成一个包含三个名字的随机列表(不允许重复)。我有一个包含10个名字的数据库,它们都对应一个数字,例如:name(1, Mary). 我写了一个谓词来生成一个随机名称:

randomname(Name) :- 
   random(0, 11, N),    % generate random integer between 1 and 10.
   name(N, Name). 

我的问题是:如何将其列入清单?并列出了三个要素? 我不想使用太多的内置插件。 length/2可能没问题。我想我可能需要它:)

非常感谢!

编辑:我想我会先尝试生成一个包含三个随机数的列表(这些名称可以在以后出现)。我写了这个非常错误的小东西:

numberlist([N|T]) :-
   random(0, 11, N),
   length([N|T], 3),
   numberlist(T).

我知道如何用/ 2谓词做到这一点;当用户只需输入他们想要一个包含三个元素的列表的查询时(例如numberlist(3,X).)。但我似乎无法弄清楚如何在代码中写下我总是想要三个数字的列表。 我也在考虑使用findall生成我的列表,但我再也不知道如何将列表的长度限制为三个随机元素。

1 个答案:

答案 0 :(得分:2)

在Prolog中描述列表时,首先描述单个元素的外观通常很有用。

例如,在您的情况下,您似乎已经有一个类似random_name/1的谓词,它描述了您要描述的列表中的单个元素。

因此,要描述一个由三个这样的元素组成的列表,那么:

random_names([A,B,C]) :-
        random_name(A),
        random_name(B),
        random_name(C).

这描述了一个包含三个元素的列表,并且random_name/1适用于每个元素。