2012-10-12 46 views
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 ] ] 
] 
+0

無論如何顯示你做了什麼。它證明你已經嘗試過了,並且可能會揭示你對Prolog的理解上的缺陷。 –

+0

證明我試過了嗎?這聽起來是強制性的...... = D – vmassuchetto

+0

是的,這證明這不是你懶得做的家庭作業。 Prolog標籤是90%的人在上課時不想自己做作業。 –

回答

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 ] ] ] 
] 

Thanks,thanosQR。

2

那麼,這種行爲是不可能的(除非我們破解序言成碎片有這樣的東西。setarg/3) (詳情查看d estructive vs single assignment

一個漂亮的類似的行爲將是:

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 ] ] 
] 

當然,因爲我們沒有做單獨的東西與ParamValue我們可以只將它們作爲一個變量: add_to_list(List1, Index, Val, List2)其中Val = [Param, Value]

簡單的執行是:

ADD_TO_LIST(L1,我,纈氨酸,L2 ): - member([I,Rest],L1) - > (append(Val,Rest,FRest), select([I,Rest],L1,[I,FRest],L2) ) append([[I,Val]],L1)。

但是這很慢;將新元素添加到列表頭部要快得多(也更簡單!)。

最後,它可能是最好使用association lists其中,以我的經驗,速度非常快,可以很容易地模擬您的問題