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

List Prolog-如何返回在列表中找到的元素列表,list,recursion,prolog,List,Recursion,Prolog,我有一个单词列表,我正在使用谓词成员(H,L)(H是包含我需要检查的单词的列表的标题,并且L包含我正在检查的单词列表,检查每个单词是否存在于另一个列表中 我试图仅提取在L列表中找到的单词。我尝试使用下面的代码,但返回列表由嵌套列表组成,除了第一个元素未初始化之外 foundValues([],_,[]). foundValues([H|T],L,K) :- member(H,L), !, foundValues(T,L,[K|H]). foundValues([_|

我有一个单词列表,我正在使用谓词
成员(H,L)
H
是包含我需要检查的单词的列表的标题,并且
L
包含我正在检查的单词列表,检查每个单词是否存在于另一个列表中

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

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

非常感谢您的帮助!

第二行应该是:

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

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

下面是正确的递归()在执行时的样子:

[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].

正如您所看到的,列表基本上是向后构建的。首先我们到达基本情况(
[]
),然后根据我们到达该情况的方式添加元素(这意味着取决于元素是否是第二个列表的成员)。

对于SWI Prolog,您还可以使用内置谓词相交/3。