Prolog - 如何返回列表中找到的元素列表

时间:2012-01-03 22:27:53

标签: list recursion prolog

我有一个单词列表,我正在检查每个单词是否存在于另一个列表中使用谓词member(H,L)H是列表的头部,其中包含我需要检查的单词和{ {1}}包含我正在检查的单词列表。

我正在尝试仅提取L列表中找到的那些字词。我试图使用下面的代码,但返回列表由嵌套列表组成,除了第一个元素未初始化的事实。

L

foundValues([],_,[]). foundValues([H|T],L,K) :- member(H,L), !, foundValues(T,L,[K|H]). foundValues([_|T],L,K) :- foundValues(T,L,K). 变量应该包含所需的输出列表。

真的很感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

第二行应该是:

foundValues([H|T],L,[H|K]) :- member(H,L), !, foundValues(T,L,K).

答案 1 :(得分:0)

如果有疑问,请在运行谓词之前尝试发出trace/0调用(或等效实现)。你在这里已经看到你的递归不太正确。

以下是执行时正确递归(@user1126943)的样子:

[trace]  ?- foundValues([1, 2], [1, 2, 3], R).
   Call: (6) foundValues([1, 2], [1, 2, 3], _G383) ? creep
   Call: (7) lists:member(1, [1, 2, 3]) ? creep
   Exit: (7) lists:member(1, [1, 2, 3]) ? creep
   Call: (7) foundValues([2], [1, 2, 3], _G465) ? creep
   Call: (8) lists:member(2, [1, 2, 3]) ? creep
   Exit: (8) lists:member(2, [1, 2, 3]) ? creep
   Call: (8) foundValues([], [1, 2, 3], _G468) ? creep
   Exit: (8) foundValues([], [1, 2, 3], []) ? creep
   Exit: (7) foundValues([2], [1, 2, 3], [2]) ? creep
   Exit: (6) foundValues([1, 2], [1, 2, 3], [1, 2]) ? creep
R = [1, 2].

基本上,如您所见,列表是向后构建的。首先我们到达基本情况([])然后我们根据我们如何达到这种情况来添加元素(意味着取决于元素是否是第二个列表的成员或者不在这里)。