【问题标题】:Prolog - how to generate list of specific length?Prolog - 如何生成特定长度的列表?
【发布时间】:2017-09-30 21:00:07
【问题描述】:

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

【问题讨论】:

  • 内置插件有多少?
  • 好吧,我想我可以使用randomlength 以及基本的is 等,但是因为这是一个练习,所以你不应该使用内置插件,除非它们是绝对有必要。如果你有内置的方法,我很乐意看到它!
  • 哦,findallbagof 也可以!

标签: list prolog


【解决方案1】:

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

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

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

随机名称([A,B,C]):- 随机名称(A), 随机名称(B), 随机名称(C)。

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

【讨论】:

  • 这其实是一个很好的解决方案!我一直想的太复杂了。唯一的问题是列表中不能有重复项,我不确定如何使用您的方法对其进行编程。你有什么想法吗?
  • 我认为这最好在单独的问题中讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多