2017-11-15 18 views
1

リストのリストから要素のフォームを削除しようとしています。これは私がやろうとしているものの例である:Prologリストのリストから削除する方法

List=[[1,2],[1,3],[4,2]] 
Max=2 
delete(List,[_|Max],List2) 
List2=[[1,3]] 

は説明:そうList与えられた私は、そのサブリスト内の第二の要素としてMaxを持つすべての要素を削除するには、削除/ 3を使用しようとしています。私はこれが標準のdelete/3述語で可能かどうかはわかりません。助けてくれてありがとう!

これは私自身の述語でこれまでに試したことです。私はこれが機能していないことを理解し、私が望むことをしません。

second_element(E, []). 
second_element(E,L):- 
    member(X,L), 
    X==[_,E], 
    delete(L,X,L2), 
    second_element(E,L2). 
+1

これは簡単な演習であり、 'delete'述部を必要としません。 'delete/3'のドキュメントを読んだら、それはどのように動作するのでしょうか? 'second_element(E、[_、E | _]) 'というヒントがあります。 'second_element(X、L)'は 'X'が' L'の2番目の要素である場合にのみ成功します。残りはPrologにおける共通の再帰的なリスト走査である。いくつかの仕事を見せて、さらに具体的な質問をしてみてください。 – lurker

+0

コメントをいただきありがとうございます。最初の述語の仕組みを詳しく説明できますか?それはリストのリストのために働くようには思われません。 –

+0

'simple_element(E、[_、E | _])。 'は、第2引数が第2引数が第1引数と同じリストであると単純に言います。 Prologの仕組みです。それは*関係*を定義します。それがうまくいくのは、Prologが単一の述語句に複数回 'E 'を見ているときに、それらを統一します(論理的には同じ値を表すと仮定します)。ややシンプルな述語は 'head_of_list(Head、List)'であり、単に 'head_of_list(H、[H | _])'と書くことができます。 – lurker

答えて

0

私はあなたにあなたの割り当てに対する答えを与えるつもりはありません。しかし、私はそれに続くPrologでよく使われるパターンをあなたに与えることができます。これに加えて私がコメントで提供したヒントは、問題を解決するために必要なすべてのツールです。

あなたはリスト、Lを持っていて、一定の基準を満たすLのそれらの要素を省略している別のリスト、RLを、必要な場合、これは一般的な再帰的なパターンで処理されます。

filtered_list([], []).  % The empty list is a filtered version of the empty list 

filtered_list([H|T], R) :- 
    ( meets_criteria_for_omission(H) 
    -> R = RT     % R will not have H if it meets criteria for omission 
    ; R = [H|RT]    % R will have H if it does not meet criteria for omission 
    ), 
    filtered_list(T, RT). 

で元の問題の場合、省略の基準は、チェックされている要素が2番目の要素が与えられたリストであるということです。つまり、チェック対象の要素を引数として指定する必要があります。そして、チェックする基準は、それが与えられたリストの2番目の要素であるかどうかです。

これは、私が単純に完全な答えを引き渡すことなく与えることができる多くの情報ですが、その方法の85%です。ヌードルを使う時間。

+0

'filtered_list([X]、Xs)はどうですか?' – false

関連する問題