2017-01-28 8 views
1

Ich versuche, dies zu erreichen:Elemente in einer verschachtelten Liste

OldList gegeben, jedes Element ersetzen, wenn das Element ein Ziel erfüllt (oldNew); Wenn nicht, ersetzen Sie den Artikel nicht.

Geben Sie eine NewList mit ersetzten Elementen zurück, die dieselbe Struktur (d. H. Dieselbe Verschachtelung) wie OldList aufweisen.

Ich bekomme es zu arbeiten (siehe meinen Code) für den Sonderfall OldList = [a, b, c], aber ich würde gerne ein Prädikat schreiben, das über die Listenlängen und verschachtelte Listen, z. auch für OldList = [a, [b, c, [d, e]]].

Vielen Dank im Voraus! /JC

oldNew(fruit, banana). 
oldNew(car, ferrari). 

replace(OldList, NewList):- 
    [X1, X2, X3] = OldList, 
    (oldNew(X1, Y1); Y1 = X1), 
    (oldNew(X2, Y2); Y2 = X2), 
    (oldNew(X3, Y3); Y3 = X3), 
    (oldNew(X1, Y1); oldNew(X2, Y2), oldNew(X3, Y3)), 
    NewList = [Y1, Y2, Y3]. 

EDIT1:

Verstanden mit beliebigen Liste Längen zu arbeiten; aber ich weiß immer noch nicht, wie man mit verschachtelten Listen umgeht.

replace2(OldList, NewList):- 
    [H | T] = OldList, 
    oldNew(H, NewHead), 
    NewList = [NewHead | T]. 
replace2(OldList, NewList):- 
    [H | T] = OldList, 
    replace2(T, NewTail), 
    NewList = [H | NewTail]. 

Antwort

2

Üblicherweise wird die Musteranpassung explizit in den Kopf gestellt. Der Code ist klarer:

replace2([], []). 
replace2([H|T], [Ht|Tt]) :- 
    ( oldNew(H, Ht) 
    -> true 
    ; is_list(H) 
    -> replace2(H, Ht) 
    ; H = Ht 
), 
    replace2(T, Tt). 

In SWI-Prolog Bibliotheken apply und yall erlauben etwas kürzer Code:

replace2(L, T) :- maplist([H,Ht]>> 
    ( oldNew(H, Ht) 
    -> true 
    ; is_list(H) 
    -> replace2(H, Ht) 
    ; H = Ht 
), L, T). 

Sie können die eingeklammerten disjunction Kopie war sehen und aus der früheren Definition eingefügt. Es ist eine Lambda-Anwendung ...

?- replace2([aa, car, apple, fruit, any, [aa, car, apple, banana, any]], T). 
T = [aa, ferrari, apple, banana, any, [aa, ferrari, apple|...]]. 
+0

Schöne Verwendung von 'apply' und' yall'. –

+0

Danke CapelliC, das hat mein Problem gelöst. – JCR

Verwandte Themen