2016-09-23 4 views
1

Ich versuche, replaceEltByclass zu definieren (E1: Liste, E2: Liste) E ist eine Liste ohne Unterliste. Jedes Element von E1, das zu einer Klasse C gehört, wird durch die Elemente von C ersetzt. Das Endergebnis wird in E2 eingegeben. Zum Beispiel liefert das Ziel rep_class ([e1, e4, e6, e11], E2) die Liste E2: [[e1, e8, e10], e4, [e3, e6, e7], e11]. Ich habe keine guten Ergebnisse.Ersetzen jedes Element einer Liste durch eine bestimmte Liste

/*The code*/ 
/*facts*/ 
class(c1,[e3, e6, e7]). 
class(c2,[e1, e8, e10]). 

/*rules*/ 

rep_class([],[]). 

rep_class([E|Q],E2) :- 
    class(C,L), 
    not(member(E,L)), 
    concat(E2,E,E2), 
    rep_class(Q,E2). 

rep_class([E|Q],E2) :- 
    class(C,L), 
    member(E,L), 
    concat(E2,L,E2), 
    rep_class(Q,E2). 


/*conventional concat*/ 
concat([],L,L). 
concat([H|T],L,[H|Res]) :- concat(T,L,Res). 

Antwort

0

Das Problem ist in: class(C,L),not(member(E,L)),, weil es zwei-Lösung ein, wenn C = C2 geben wird und dann beispielsweise in C2 e1 gehört, so dass es mit L ersetzt und einer Lösung, wenn C = C1, wo es verlassen wird es als e1. Sie müssen schreiben: "Gibt es ein solches Mitglied (e1, L) ??" so müssen Sie alle möglichen Listen sammeln und sehen, ob Mitglied (e1, L) für eine Liste steht L. So mit einigen Änderungen meine Version ist:

class(c1,[e3, e6, e7]). 
class(c2,[e1, e8, e10]). 

rep_class([],[]). 

rep_class([E|Q],[E|E2]) :- 
    findall(L,class(_,L),List), 
    not(find(List,E,_)), 
    rep_class(Q,E2). 

rep_class([E|Q],[Lout|E2]) :- 
    findall(L,class(_,L),List), 
    find(List,E,Lout), 
    rep_class(Q,E2). 

find([Lin|_],E,Lin):-member(E,Lin). 
find([Lin|T],E,Lout):-not(member(E,Lin)),find(T,E,Lout). 

Als Beispiel:

?- rep_class([e1,e4,e6,e11], E2). 
E2 = [[e1, e8, e10], e4, [e3, e6, e7], e11] ; 
false. 
+0

Es hat das richtige Verhalten. Ich verstehe auch die Fehler und die Notwendigkeit, das Finden-Prädikat zu verwenden. – Hana

Verwandte Themen