【问题标题】:Prolog recursion: extracting wanted resultProlog递归:提取想要的结果
【发布时间】:2014-03-28 00:53:42
【问题描述】:

我正在尝试在 Prolog 中创建一个谓词,将另一个谓词应用于给定列表中的所有元素:

take_items(_,[],_).
take_items(Stock,[Item|BTail],_) :-
    take_item(Stock,Item,Updates),
    take_items(Updates,BTail,Updates).

仅供参考:我正在使用 SWI-Prolog。 在跟踪模式下,我可以看到它确实做了我想要的,但随后开始回溯。这是从它到达基本情况到结束的跟踪输出:

   Call: (8) take_items([item(a, 2), item(b, 1)], [], [item(a, 2), item(b, 1)]) ? creep
   Exit: (8) take_items([item(a, 2), item(b, 1)], [], [item(a, 2), item(b, 1)]) ? creep
   Exit: (7) take_items([item(a, 2), item(b, 3)], [item(b, 2)], [item(a, 2), item(b, 3)]) ? creep
   Exit: (6) take_items([item(a, 3), item(b, 3)], [item(a, 1), item(b, 2)], _G1991) ? creep
true .

如何在调用take_items([first,list],[second,list],X).时输出X = [list, of, items]

【问题讨论】:

  • 第三个参数有什么意义,如果两个子句都忽略它?
  • 如果这看起来很愚蠢,请原谅我。我是 Prolog 的新手。第三个参数是所需结果的转储位置。

标签: recursion prolog


【解决方案1】:

这应该可以工作

take_items(_,[],[]).
take_items(Stock,[Item|BTail],[Update|Updates]) :-
    take_item(Stock,Item,Update),
    take_items(Updates,BTail,Updates).

我正在尝试在 Prolog 中创建一个谓词,将另一个谓词应用于给定列表中的所有元素:

其实有 maplist/3 可用

take_items(Stock,Items,Updates) :- maplist(take_item(Stock),Items,Updates).

【讨论】:

  • 我使用了您的第一个解决方案,递归 take_items 调用的第一个参数作为更新而不是更新。然后第三个参数包含结果的步骤列表。为了提取最后一步,我在使用 take_items 谓词时使用了“last”谓词来获取最后一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2014-06-16
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多