2014-05-02 157 views
0

我有一個這樣的名單:列表序言名單替換元素

board([[16, -,15, -,14, -,13], 
     [ -,A, -, -, -,B,-], 
     [12, -,11, -,10, -,9], 
     [ -, -, -,C, -, -,-], 
     [8, -,7, -,6, -,5], 
     [- ,D, -, -, -,E,-], 
     [4, -,3, -, 2, -,1]]). 

我想在一個功能要素16 15,15 11,11 12和12 16。我知道,以取代如何更換在列表中的元素,但我不知道怎麼用這個例子做

答案應該是這樣的:

board([[12, -,16, -,14, -,13], 
     [ -,A, -, -, -,B,-], 
     [11, -,15, -,10, -,9], 
     [ -, -, -,C, -, -,-], 
     [8, -,7, -,6, -,5], 
     [- ,D, -, -, -,E,-], 
     [4, -,3, -, 2, -,1]]). 
+0

你能告訴我們你到目前爲止試過的東西嗎? –

+0

這個數字是循環的。我想旋轉圓圈,並用第二,第二,第三,第三,第四和第四替換第一個元素,但我不能保留在一個列表中,如[16,15,12,11] – Krzysiek

回答

1

確定,所以我們需要做的第一件事就是確定我們如何將會取代最簡單的價值觀方式是將這些視爲功能對。我們可以存儲列表清單,而不是存儲列表[16,15,12,11]; [[16,15],[15,12],[12,11],[11,16]]解決了我們在存儲什麼替換的問題。我們的下一步是打破投入。

parse_2d_list([]). 

parse_2d_list([H|Tail]) :- %this is my quick parser that breaks it up 
    replace_functor(H), %your replacer function 
    parse_2d_list(Tail). 

我上面的例子只是概述了基本的分析方法,你可能需要額外的變量來綁定輸入和輸出。

現在我們要通過我們的名單

replace_functor([H|Tail],[[Val|Rep]|RTail]],Output,Ac) :- %here I'm using Reps to represent our replacement value  
    H == Val, 
    append(Ac,Rep,Ac2), 
    replace_functor(Tail,[Val|Rep]|RTail]],Output,Ac2). 

這僅涉及單一的情況下進行搜索。我們需要巧妙地確定如何迭代替換列表。

另一種方法是,如果您不想處理輔助列表,則使用動態。

:- dynamic replace/2 

在這裏,我們允許更換/ 2持有的價值和它的替代品,所以如果我說

assert(replace(16,15)). 

我在我的知識基礎,以幫助創建結合事實。我們可以通過做

retract(replace(16,15)). 

在這種情況下,在最後清理它我們可以方便的更換爲:

replace_functor([H|Tail],Output,Ac) :- 
    replace(Val,Rep), 
    H == Val, 
    append(Ac,Rep,Ac2), 
    replace_functor(Tail,Output,Ac2). 

你仍舊需要幾個不同的謂詞來收拾這個程序,但斷言給你很多免費的模式匹配。

希望這足以讓你走向正確的方向。

+0

嗯......在這一刻,我認爲我的董事會寫得不好......這應該是像這張圖片一樣工作http://s6.ifotos.pl/img/lllgif_enrewhn.gif – Krzysiek

+0

@Bart是的,我會訂購它,所以第一個列表在列表中是A,第二個是B,依此類推。你不需要列表中的董事會信件。最重要的是,列表中的大寫字母是按照prolog約定的變量,所以你會得到一些非常奇怪的綁定。 –

+0

所以要將這張圖片保存在列表中,它會看起來像這樣:board([[16,15,14,13],[12,11,10,9],[8,7,6,5],[ 4,3,2,1]])。 ? a,b,d,e沒有c? – Krzysiek