2017-10-17 3 views
0

Was ich versuche zu erreichen, ist zu bekommen, was "Komponenten" nicht verwendet werden. Also habe ich eine Liste mit allen 'Komponenten' und 'gebrauchten Komponenten' erstellt.
Meine Idee ist, diese Listen zu vergleichen und eine andere Liste mit den Elementen zu erstellen, die nicht übereinstimmten.Holen Sie Elemente, die nicht in der zweiten Liste sind

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). 

Ich weiß nicht, wie so etwas zu tun: member('name comp', List)., wo ich ‚Name comp‘ mit jedem Element der anderen Liste ersetzen kann.

Vielen Dank im Voraus.

Beispiel:

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

Können Sie ein Beispiel von zwei Listen geben und was Sie versuchen zu tun, da bis jetzt es überhaupt nicht klar ist ... – coder

+0

Hallo @ coder. Ich habe das Beispiel hinzugefügt. –

Antwort

1

Sie könnten ein einfaches rekursive Prädikat in die Elemente der comp_list zu erhalten, die nicht Mitglied der inuse_list ist:

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). 

und verwenden Sie sie mögen:

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

oder eine andere Art und Weise findall/3 Prädikat mit:

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

Ich habe das Prädikat findall verwendet und perfekt gearbeitet. Vielen Dank. –

+0

@FedericoRibero, froh zu helfen !!! – coder

2

Obwohl die Antwort richtig ist, ist es viel besser Listen zu vermeiden, solange Sie können, wenn Sie über Fakten und Regeln in der Datenbank zur Vernunft brauchen. In diesem Fall wird ein Ziel nicht verwendeten Komponenten leicht als

definiert

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

Diese aufzählt schön die nicht benötigten Komponenten. Wenn Sie sie in einer Liste haben möchten, verwenden Sie findall/3 über unused/1. In den meisten Fällen ist die Definition von unused/1 jedoch viel einfacher mit anderen reinen logischen Beziehungen zu kombinieren.

In den meisten Fällen Aggregation Primitiven wie findall/3, aggregate/3 usw. werden am besten bis zum Ende verzögert oder gar nicht verwendet.

Verwandte Themen