2016-09-23 42 views
2

我是新的prolog,並且遇到了我需要幫助的練習練習。從序列中的兩個列表中刪除連續序列

問題是要求定義一個謂詞removeContig(A,B),斷言列表B與列表A相同,只不過相同項目的連續序列實例被簡化爲一個實例。

例子:

removeContig ([a,a,b,b,b,c,c,c], [a,b,c]) -> true. 
removeContig ([a,a,b,b,b,c,c,c], [a,b,c]) -> true. 
removeContig ([a,a,b,b,b,c,c,c], [a,b,b,c]) -> false. 
removeContig ([a,b,c,a,b,c], [a,b,c]) -> false. 
removeContig ([a,b,c,a,b,c], [a,b,c,a,b,c]) -> true. 
removeContig([[a],[b,b],[b,b],[a,a],[a,a],[b]], [[a],[b,b],[a,a],[b]]) -> true. 

我如何能解決這個問題將是很大的幫助任何幫助。

回答

1

什麼

removeContig([], []). 

removeContig([A], [A]). 

removeContig([Hi , Hi | Ti], Lo) :- 
    removeContig([Hi | Ti], Lo). 

removeContig([H1 , H2 | Ti], [H1 | To]) :- 
    H1 \= H2, 
    removeContig([H2 | Ti], To). 

訣竅是複製輸入列表的頭部,作爲輸出列表的頭部,僅當下列元素不同時。

觀察到輸入列表爲空的情況下,需要空列表子句(removeContig([], []).)。

---編輯---

至於問由OP,我試圖改善答案。

我爲removeContig寫了四個條款;前兩個是終端案件,我希望不需要解釋。

removeContig([], []). 

removeContig([A], [A]). 

我點的事實,第一個是隻需要調用removeContig與輸入列表爲空的情況下,僅關注。

接下來......我們要做什麼?

算法包括複製輸入列表的第一個元素作爲輸出列表的第一個元素,僅當輸入列表的第二個元素不同時

所以,排除了終端的情況下(只有一個元素在輸入列表中,所以將其複製在輸出列表),我們有兩種情況:

1)第一和輸入列表的第二個元素是相等的,所以刪除(不復制)的第一個

2)在第一和輸入列表的第二個元件是不同的,所以複製的拳頭一個作爲第一輸出列表

的箱子(1)由以下條款管理

removeContig([Hi , Hi | Ti], Lo) :- 
    removeContig([Hi | Ti], Lo). 

其中[Hi, Hi | Ti]表示前兩個元素是相等的;在這種情況下被稱爲removeContig具有相同的參數,除了輸入列表中的第一個元素被忽略。

的情況(2)由下面的子句管理

removeContig([H1 , H2 | Ti], [H1 | To]) :- 
    H1 \= H2, 
    removeContig([H2 | Ti], To). 

其中[H1, H2 | Ti]H1 \= H2確保我們,在輸入列表中的前兩個元素是不同的;在這種情況下,我們必須複製輸入列表中的第一個元素(H1)作爲輸出列表的第一個元素;並且這是通過[H1 | To]獲得的,其中To是從以下呼叫removeContig/2獲得的。

+0

Hello Mat,removeContig([Hi,Hi | Ti],Lo)的目的是什麼: - removeContig([Hi | Ti],Lo)。 ([H1 | H2 | Ti],[H1 | To]): - H1 \ = H2, removeContig([H2 | Ti],To)。您能否請添加評論,因爲我想了解解決方案?謝謝。 –

+0

@SyedRahman - 呃...我是max66,不是Mat; Mat,在StackOverflow中,是一個比我更好的Prolog專家。無論如何...給我一些minuts,我試圖擴大我的答案。 – max66

2

這與命令行工具uniq完全相同;至少在SWI-Prolog中,它可用於group_pairs_by_key/2。它確實比你更需要,但它可以像這樣使用:

uniq(L, U) :- 
     pairs_keys_values(Ps, L, L), 
     group_pairs_by_key(Ps, G), 
     pairs_keys(G, U). 

你當然可以看implementation的,使用它作爲一個起點,編寫自己的(應該是相當直接的,你只需要刪除一些東西)。

這隻適用於如果你的第一個參數(與重複列表)是研磨!