我正在做这个练习,我必须编写一个谓词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
生成我的列表,但我再也不知道如何将列表的长度限制为三个随机元素。
答案 0 :(得分:2)
在Prolog中描述列表时,首先描述单个元素的外观通常很有用。
例如,在您的情况下,您似乎已经有一个类似random_name/1
的谓词,它描述了您要描述的列表中的单个元素。
因此,要描述一个由三个这样的元素组成的列表,那么:
random_names([A,B,C]) :- random_name(A), random_name(B), random_name(C).
这描述了一个包含三个元素的列表,并且random_name/1
适用于每个元素。