【问题标题】:Prolog "findall/3" does not return a listProlog“findall/3”不返回列表
【发布时间】:2021-05-14 10:57:28
【问题描述】:

我很难理解为什么 findall/3 在我的程序中会这样。基本上我已经写了我的谓词, 那应该是一个 list ,并返回每个可能的索引,例如,如果我的 list 长度为 3, pairs([1,2,3],L) 将返回 [1/2, 1/3, 2/3] 这是我预期的列表。(在我的对谓词中,我使用 findall 生成此列表 L)
但是我写了另一个谓词,它应该返回一个列表,其中包含一个列表的所有子列表,并且该谓词也使用 findall,但结果不是我所期望的。

/*calculate a list CASES with all the sublists from LIST .*/
test(LIST, CASES):-
   pairs(LIST, L),
   member(X/Y, L),  
   findall(SUBLIST, sublist(LIST, X, Y,  SUBLIST), CASES).

结果是这样的(我必须按; 才能生成所有结果)。

[[1, 2]]    
[[1, 2, 3]] 
[[2, 3]]

为什么 findall 的结果没有附带列表?

【问题讨论】:

  • member(X/Y, L) 在您的情况下提供三种解决方案...
  • 我明白你的意思,我写的每个成员 findall .. 但是每个成员(几个索引)只有一个子列表。
  • 有没有办法将所有子列表放在带有内置谓词的 LIST 中,或者我应该使用某种形式的追加?

标签: prolog


【解决方案1】:

当评估findall(SUBLIST, sublist(LIST, X, Y, SUBLIST), CASES) 时,X 和 Y 已经绑定到值。对于 sublist([1, 2, 3], 1, 2, SUBLIST),只有一个解决方案 ([1, 2]),它 findall 在列表中返回。

当您回溯时,X 和 Y 被分配不同的值,并且 findall 再次被评估,导致不同的单个结果。

你必须在 findall 中移动成员调用

test(LIST, CASES):-
   pairs(LIST, L), 
   findall(SUBLIST, (member(X/Y, L), sublist(LIST, X, Y,  SUBLIST)), CASES).

(我不再完全确定语法,但它是这样的)

【讨论】:

  • 非常感谢,我想说但我不知道我可以在 findall 的第二个参数中包含 2 个语句。
  • @brucebanner 如果这解决了您的问题,您可以通过单击复选标记接受答案
  • 我很抱歉,我想立即这样做,但网站告诉我几分钟后我必须这样做,我分心并忘记了它!你很好地提醒了我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多