2012-01-03 22 views
0

私は単語のリストを持っています。述語member(H,L)H)を使用して別のリストに存在する場合、各単語をチェックしています。私がチェックしている単語のリストを含むLを確認する必要がありますProlog - リストにある要素のリストを返す方法

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

答えて

0

2行目は次のようになります。

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

あなたが見ることができるように基本的にリストが後方に構築されています。最初に基本ケース([])に到達し、このケースにどのように到達したかによって要素を追加します(要素が2番目のリストのメンバーであるかどうかに応じて、ここではない)。

関連する問題