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

3

我正在进行一项练习,需要编写一个谓词 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
我想我可以使用 randomlength 以及基本的 is等函数,但由于这是一道练习题,除非绝对必要,否则不应使用内置函数。如果你有内置函数的方法,我很乐意看到它! - N.W.
哦,findallbagof也是可能的! - N.W.
1个回答

2
描述Prolog中的列表时,通常首先描述一个单个元素的外观。例如,在您的情况下,似乎已经有一个像“random_name/1”这样的谓词,它描述了您想要描述的列表的单个元素。因此,为了描述由三个这样的元素组成的列表,可以使用以下代码:
random_names([A,B,C]) :-
        random_name(A),
        random_name(B),
        random_name(C).
这描述了一个包含三个元素的列表,并且“random_name/1”对于这些元素中的每一个都成立。

1
这实际上是一个非常好的解决方案!我一直在想得太复杂了。唯一的问题是列表中不能有重复项,我不确定如何使用您的方法进行编程。你有什么想法吗? - N.W.
1
我认为这个问题最好在另一个问题中讨论。 - mat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接