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。