2016-11-23 9 views
0

私はちょうどPologを勉強し始めているので、私は以下のことをしなければならない 最初に: 私は述語を書いて、リストAには、Bが持つ要素のうちのいくつかだけが含まれています。 (A = [a、b] B = [a、b、c]が真である)、私はそれを行いましたが、両方のリストの等しい要素が同じカウントであるかどうかを判断する必要もあります。Prologの2つのリストを比較すると、両方のリストの等しい要素が同じ数であるかどうかを確認する

Example: 
A = [b,b,c,c]  (b and c is member of B so its true) 
B = [a,b,b,c,c,d,f,g] 
<--would be true 

私は最初の部分を書きましたが、まだカウントを確認する必要があります。 [先生はselectを使用して提案し、それが

2番目のオプションです: リストCが唯一のいくつかが含まれている場合は、私がチェックする述語別の表現を、追加する必要がありしかし、私はそれをチェックすると数字を並べ替えに使用することはできませんBが持つ要素(前のタスクと同じ) (既に行われていますが)Bの要素がCで2回表示されているかどうかを確認する必要があります。

Example: 
A = [b,b,c,c] 
B = [a,b,b,c,c,d,e,f,g] 
C = [b,b,b,b,c,c,c,c] /or/ C=[a,a,b,b,b,b] 
would be true. 
(C = [a、b] B = [a、b、c]

EDIT1:そして私がこれまでに書いたコードは次のとおりです。

subset([ ],_). 
subset([H|T],List) :-  
    member(H,List),  
    subset(T,List).  



p(A,B,C) :-     %this is the predicate in which I have to 
    subset(A,B),    %compile everything together 
    subset(C,B).  
+0

あなたは既に書いたコードを投稿できますか? – Rodolfo

答えて

0

最初のものは、我々がいることを確認し、その後、彼らはAに表示されるB上のすべての要素を除去し、残っているものを返すことによって達成することができますremainderはAにある要素を含んでいません(IEは同じ数です)。

dontIntersect(L1,L2) :- 
    intersection(L1,L2,[]). 

subset_2([], R, R). 

subset_2([H | T], List, R):- 
    select(H, List, NewList), 
    subset_2(T, NewList, R). 

subset(L1, L2):- 
    subset_2(L1,L2,Remainder), 
    dontIntersect(L1,Remainder). 

2番目の要素は、リストから2つの要素を一度に削除する点を除き、非常に似ています。

dontIntersect(L1,L2) :- 
    intersection(L1,L2,[]). 

subset_2([], R, R). 

subset_2([H | T], List, R):- 
    select(H, List, NewList1), 
    select(H, NewList1, NewList2), 
    subset_2(T, NewList2, R). 

subset(L1, L2):- 
    subset_2(L1,L2,Remainder), 
    dontIntersect(L1,Remainder). 
+0

ありがとうRodolfo!これはまさに私がこの問題を解決するために想像したものでしたが、まだそれをコードに入れることはできませんでした。私はあなたのコメントをupvotedしましたが、私は15の評判に達したときにだけ表示されます:]しかし、私はコードの第2部分で問題を抱えています、それは編集でそれを説明しようとちょうど秒: – Pavels

+0

'[トレース] 69?サブセット3x([a、b]、[a、a、b、b、c])。 ... 終了:(10)select([]、[b、c]、[b、c])?クリープ** .. コール:(9)リスト:交差点([a、b]、[b、c]、[])?クリープ **失敗:(9)リスト:交差点([a、b]、[b、c]、[])? ** ' 問題を強調表示しました。その段階で空のリストが表示されるので、いくつかのシンボルがリマインダーで捕捉されます。現在、この問題を解決する方法を考えているIm:D – Pavels

+0

NEVERMIND、申し訳ありません、それはすべて動作します。私はあなたのコードを統合するときに間違いを犯しました。 とにかく、ありがとうございました。] – Pavels

関連する問題