2017-09-30 55 views
2

我正在做这个练习,为此我必须编写一个谓词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来生成我的列表,但我不知道如何将列表的长度限制为三个随机元素。

+2

有多少内置插件? – lurker

+0

嗯,我想我可以使用'random'和'length'以及基本的'is'等,但是因为这是一个练习,除非他们是绝对必要的,否则您不应该使用内置函数。如果你有内置的方式,我很乐意看到它! –

+0

哦,'findall'和'bagof'也是可能的! –

回答

2

当描述在序言列表,它往往是有用的,首先描述单 元素的样子。

例如,就您的情况而言,您似乎已有一个谓词,如random_name/1,它描述了您想要描述的列表的单个元素。

因此,描述由这样的元素,那名单:

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

这说明有三个元素的列表,以及random_name/1适用于这些元素。

+1

这实际上是一个非常好的解决方案!我一直在想办法太复杂。唯一的问题是,列表中不能有重复,我不确定如何使用你的方法编程。你有什么想法? –

+1

我认为这应该在一个单独的问题中得到最好的讨论。 – mat