2017-10-17 137 views
0

我試圖完成的是獲得什麼'組件'沒有被使用。所以我創建了一個包含所有'組件'和'使用組件'的列表。
我的想法是比較這個列表並創建另一個不匹配元素的列表。獲取不在第二個列表中的元素

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

你能給你正在試圖做的,因爲到現在爲止還不清楚在所有... – 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).

這很好地枚舉未使用的組件。如果您希望他們在列表中,請使用findall/3而不是unused/1。在大多數情況下,儘管unused/1的定義更容易與其他純邏輯關係相結合。

在大多數情況下,聚合原始數據如findall/3,aggregate/3等最好延遲到最後或根本不使用。

相關問題