我有一个单词列表,我正在检查每个单词是否存在于另一个列表中使用谓词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).
变量应该包含所需的输出列表。
真的很感谢你的帮助!
答案 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].
基本上,如您所见,列表是向后构建的。首先我们到达基本情况([]
)然后我们根据我们如何达到这种情况来添加元素(意味着取决于元素是否是第二个列表的成员或者不在这里)。