0

共通インデックスに従ってリストに要素を追加する述語を作成しようとしています。私がこれまでに行ったことは、明らかに価値がありません... =(

予想される動作は次のようになります。

List = [ ]

add_to_list( List, Index1, Param1, Value1 )
List = [
    [ Index1, [ Param1, Value1 ] ]
]

add_to_list( List, Index1, Param2, Value2 )
List = [
    [ Index1, [ Param1, Value1 ], [ Param2, Value2 ] ]
]

add_to_list( List, Index2, Param3, Value3 )
List = [
    [ Index1, [ Param1, Value1 ], [ Param2, Value2 ] ],
    [ Index2, [ Param3, Value3 ] ]
]
4

2 に答える 2

2

まあ、この動作は不可能です (プロローグを のようなものでバラバラにハックしない限りsetarg/3)。(詳細については、破壊的対単一割り当てを確認してください)

かなり似た動作は次のようになります。

List0 = [ ]

add_to_list( List0, Index1, Param1, Value1, List1)
List1 = [
    [ Index1, [ Param1, Value1 ] ]
]

add_to_list( List1, Index1, Param2, Value2, List2)
List2 = [
    [ Index1, [ Param1, Value1 ], [ Param2, Value2 ] ]
]

add_to_list( List2, Index2, Param3, Value3, List3)
List3 = [
    [ Index1, [ Param1, Value1 ], [ Param2, Value2 ] ],
    [ Index2, [ Param3, Value3 ] ]
]

もちろん、個別のものを使用しないので、ParamそれらValueを 1 つの変数として渡すことができます add_to_list(List1, Index, Val, List2)Val = [Param, Value]

簡単な実装は次のようになります。

add_to_list(L1, I, Val, L2):- member([I,Rest],L1) -> ( append(Val,Rest,FRest), select([I,Rest], L1, [I,FRest], L2) ) ; append([[I,Val]], L1)。

しかし、これは非常に遅いです。新しい要素をリストの先頭に追加する方がはるかに高速です (そして簡単です!)。

最後に、私の経験では、非常に高速で問題を簡単にモデル化できる連想リストを使用するのがおそらく最善です。

于 2012-10-12T21:56:39.790 に答える
1

私はこれを行うことでそれを得ました:

add_to_list( [ ], Param, Val, Val2, [ [ Param, [ [ Val, Val2 ] ] ] ] ).
add_to_list( L, Param, Val, Val2, LNew ) :-
    member( [ Param, Vals ], L ) ->
    (   select( [ Param, Vals ], L, L2 ),
        not( member( [ Val, Val2 ], Vals ) ) ->
        (   append( Vals, [ [ Val, Val2 ] ], Vals2 ),
            append( [ [ Param, Vals2 ] ], L2, LNew )
        );  append( L, L2, LNew )
    );  append( L, [ [ Param, [ Val, Val2 ] ] ], LNew ).

したがって、動作は次のとおりです。

List1 = []

add_to_list( List1, Index1, Param1, Value1, List2 )
List2 = [
    [ Index1, [ [ Param1, Value1 ] ] ]
]

add_to_list( List2, Index1, Param2, Value2, List3 )
List3 = [
    [ Index1, [ [ Param1, Value1 ], [ Param2, Value2 ] ] ]
]

add_to_list( List3, Index2, Param3, Value3, List4 )
List4 = [
    [ Index1, [ [ Param1, Value1 ], [ Param2, Value2 ] ] ],
    [ Index2, [ [ Param3, Value3 ] ] ]
]

ありがとう、thanosQR。

于 2012-10-13T12:30:59.023 に答える