2016-05-22 18 views
0

私は[a([x,y]), b([u,v])]のようなリストを持っています。私の結果は[[x,y], [u,v]]です。ここ は私のコードです:Prologリストのリストへの述語のリスト

p(L, Res) :- 
    findall(X, (member(a(X), L)), A1), append([A1],[],L1), 
    findall(Y, (member(b(Y), L)), A2), append(L1,[A2],L2), 
    append(L2, Res). 

これは、部分的に良い結果を提供しますが、私のリストが[a([x,y]), c([u,v])]であれば、私はあることを、結果を希望:[[x,y],[]]、それが[[x,y]]です。
より多くの例:

p([b([u,v]), a([x,y]), c([s,t]), d([e,f])], R) 

私が得る結果:(予想通り)[[x,y],[u,v]]

p([b([u,v]), z([x,y]), c([s,t]), d([e,f])], R) 

結果は[[u,v]]'です。
結果:[[],[u,v]]です。

EDIT:さらに多くの例を追加しました。ヘッド 用語の主ファンクタに対応する原子であり、その尾部期間の引数のリストであるリストを

+0

'アペンド([A1]、[]、L1は)'です'[A1] = L1'と同じですか? – lurker

+0

はい、同じです。 – zaig

+1

'[b([x、y])、a([u、v])]'があれば?あなたの述語は '[[u、v]、[x、y]]'を生成します。それは正しい結果ですか? 'findall/3'ではなく' maplist'を使うことを検討すべきです。 – lurker

答えて

1

今では問題文は本当に、溶液をもう少し理解されているものは明らかだということ。あなたの現在のソリューションは少し過度であり、単純化することができます。また、用語が見つからない場合に[]要素を使用する場合は、パラダイムの外に少し出ますので、例外として扱うことができます。 @AnsPiterには=../2の使用に関する正しいアイデアがあります。特に、リスト内にaおよび/またはbの複数のオカレンスを処理するソリューションが必要な場合は、

p(L, Res) :- 
    find_term(a, L, As),  % Find the a terms 
    find_term(b, L, Bs),  % Find the b terms 
    append(As, Bs, Res).  % Append the results 

find_term(F, L, Terms) :- 
    Term =.. [F, X], 
    findall(X, member(Term, L), Ts), 
    ( Ts = []    % No results? 
    -> Terms = [[]]   % yes, then list is single element, [] 
    ; Terms = Ts   % no, then result is the list of terms 
    ). 

使用法:

| ?- p([b([u,v]), z([x,y]), c([s,t]), d([e,f])], R). 

R = [[],[u,v]] 

yes 
| ?- p([b([x,y]), a([u,v])], L). 

L = [[u,v],[x,y]] 

yes 
| ?- 

上記の溶液をabの複数の発生を処理します。

問題は本当にそれぞれの1つの出現に制限されている場合は、findall/3append/3は道行き過ぎであり、述語が書くことができます。

p(L, [A,B]) :- 
    ( member(a(A), L) 
    -> true 
    ; A = [] 
    ), 
    ( member(b(B), L) 
    -> true 
    ; B = [] 
    ). 
0

Term =.. List :統合リスト。

例:

| ?- foo(n,n+1,n+2)=..List. 
List = [foo,n,n+1,n+2] ? 

| ?- Term=..[foo,n,n+1,n+2]. 
Term = foo(n,n+1,n+2) 

はあなたの提案に依存しています。あなたは一つの引数を含む用語を持っていますList
so;

p([],[]).        
p([X|Xs], Result) :- 
      X=..[F,Y], 
      (%IF 
      \+(F='c')-> % not(F=c)    
      Result=[Y|Res]; 
      %ELSE   
      Result = Res % Result = [Res] ==> [[x,y],[]] 
      ), 
      p(Xs,Res). 

テスト:

| ?- p([a([x,y]), c([u,v])],R). 
R = [[x,y]] ? 
yes 

| ?- p([a([x,y]), b([u,v])],R). 
R = [[x,y],[u,v]] ? 
yes