【问题标题】:List a given number of element in a list prolog在列表序言中列出给定数量的元素
【发布时间】:2015-04-23 23:25:33
【问题描述】:

我正在尝试列出我存储在 List 中的给定数量的元素,我的代码如下

er(Person,List) :- findall(A, descendant(Person, A), List).

当我在 prolog 中键入下面的代码时,我得到了与我的查询匹配的所有元素。

呃(詹姆斯,X)。

我想要实现的是让 prolog 列出给定数量的元素,例如

呃(詹姆斯,3)。

Prolog 最多只会返回列表中的 3 个元素。我研究了一下,发现我可以使用 findnsols 而不是 findall 运算符,但我找不到在我的代码中实现它的实用方法。

【问题讨论】:

  • findnsols(3, A, descendant(Person, A), List) 应该可以工作。请解释您的问题...
  • findnsols 对我来说不是最佳选择,因为它需要两个以上的元素才能将其保持在 er(X,Y) ,我对 findnsols 的问题也是我必须在查询而不是在程序本身中键入它。比如findnsols(Nth, A, descendant(Person, A), List).,第n个可以是0到999之间的任何数字。
  • findnsols(count(N), etc etc) 允许“动态”更改返回的列表长度。但这个高级功能似乎超出了您的需求。在某些时候,在调用 findnsols 之前,您会知道值 Nth,不是吗?所以就用它吧

标签: prolog


【解决方案1】:

嗯,显而易见的方法是这样说:

er(P,N,L) :-
  findnsols(N,A,descendant(P,A),L)
  .

但你似乎不想这样做。您可能会考虑这样的事情:

er(P,L) :-
  var(L),
  findall(A,descendant(P,A),L)
  .
er(P,L) :-
  nonvar(L),
  length(L,N),
  findnsols(N,A,descendant(P,A),L)
  .

如果您想要返回所有解决方案,只需像这样调用它:

er(james,L).

如果你想限制一些东西,像这样:

er(james,[A,B,C]).

或(因为length/2 可以生成):

length(5,L) , er(james,L).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2010-11-19
    • 1970-01-01
    • 2014-01-12
    • 2016-05-26
    • 2018-11-05
    相关资源
    最近更新 更多