2017-10-17 17 views
0

私が達成しようとしているのは、「コンポーネント」が使用されていないことを取得することです。そこで私はすべての「コンポーネント」と「使用中のコンポーネント」を含むリストを作成しました。
私の考えは、このリストを比較し、一致しなかった要素で別のリストを作成することです。2番目のリストにない要素を取得する

component('name 1', 1). 
component('name 2', 2). 
component('name 3', 3). 
component('name 4', 4). 
component('name 5', 5). 

inUse(1, 'name 1'). 
inUse(1, 'name 3'). 
inUse(1, 'name 5'). 

comp_list(L):- findall(Comp, component(Comp, _), L). 
inuse_list(L):- findall(Comp, inUse(_, Comp), L). 

私はこのような何かするのか分からない。私は他のリストのすべての要素に「名前のコンプ」を置き換えることができmember('name comp', List).を。

ありがとうございます。

例:

L1 = ['name 1', 'name 2', 'name 3', 'name 4', 'name 5'] %comp_list(L). 
L2 = ['name 1', 'name 3', 'name 5']      %inuse_list(L). 

someRule(R):- comp_list(L1), inuse_list(L2), %more code, to obtain a list R with: 

R = ['name 2', 'name 4'] (Elements lacking on inuse_list) 
+0

これまで2つのリストの例を示していますが、これまでに何をしようとしているのかは分かりません。 – coder

+0

こんにちは@coder。私は例を追加しました。 –

答えて

1

あなたはinuse_listのメンバーではありませんcomp_listの要素を取得する単純な再帰述語追加することができます。

obtain_elements([],_,[]). 
obtain_elements([H|T],L,[H|T1]):-\+member(H,L),obtain_elements(T,L,T1). 
obtain_elements([H|T],L,L2):-member(H,L),obtain_elements(T,L,L2). 

をし、同じようにそれを使用します。

someRule(R):- comp_list(L1), 
       inuse_list(L2), 
       obtain_elements(L1,L2,R). 

または別の方法findall/3述語を使用して:

someRule(R):- comp_list(L1), 
       inuse_list(L2), 
       findall(X,(member(X,L1),\+member(X,L2)),R). 
+0

私はfindall述語を使って完全に動作しました。どうもありがとうございました。 –

+0

@FedericoRibero、うれしい! – coder

2

答えが正しいですが、あなたは、データベース内の事実やルールについて推論する必要がある場合、限りすることができますようにリストを避けるためにはるかに優れています。この場合、目標未使用成分は容易

ununsed(Name) :- component(Name, _), \+ inUse(_, Name).

として定義されてこれがうまく使用されていない成分を列挙する。それらをリストに入れたい場合はunused/1よりfindall/3を使用してください。ほとんどの場合、unused/1の定義は他の純粋な論理関係と組み合わせるのが簡単です。

ほとんどの場合などfindall/3aggregate/3、などの集約プリミティブは、最高の非常に最後まで遅れたか、まったく使用されていません。

関連する問題