2017-01-28 18 views
1

ネストされたリスト内の1つのまたは複数の要素を交換してください:OldList考える私はこれを達成しようとしています

、アイテムがゴール(oldNew)を満たした場合に任意の項目を置き換えます。そうでない場合は、商品を交換しないでください。

NewListを、同じ構造(つまり同じネスト)を持つ置換済みアイテムとともに返します(OldList)。

特殊ケースOldList = [a, b, c]については私のコードを参照してください。しかし、リストの長さとネストされたリストの間で一般化する述語を書きたいと思います。 OldList = [a, [b, c, [d, e]]]も同様です。

ありがとうございます! /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:

は、それが任意のリストの長さで動作するようになりました。しかし、私はまだネストされたリストを処理する方法を知らない。

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

答えて

2

通常、パターンマッチングは頭部で明示されます。コードは明確である:

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

あなたは括弧論理和をコピーして、元の定義から貼り付けた見ることができます:SWI-Prologのライブラリapplyyall

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

少し短いコードが可能になります。これはラムダアプリケーションです...

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

'apply'と' yall'をうまく使います。 –

+0

CapelliCありがとう、これは私の問題を解決しました。 – JCR

関連する問題