2012-01-03 130 views
0

我有一個單詞列表的列表,如果使用謂詞member(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變量應該保存所需的輸出列表。

非常感謝您的幫助!

+2

使用SWI-Prolog,你也可以使用內建的謂詞相交/ 3。 – gusbro 2012-01-04 13:34:16

回答

0

第二行應該是:

foundValues([H|T],L,[H|K]) :- member(H,L), !, foundValues(T,L,K). 
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]. 

基本上列表向後建,你可以看到。首先我們到達基本案例([]),然後根據我們如何到達這種情況(意思取決於元素是否是第二個列表的成員或不在此處)添加元素。

相關問題